不久前,我拿起了OpenGL SuperBible第五版的副本,慢慢地,痛苦地开始自学OpenGL 3.3方式,之后习惯了从学校回来的1.0路。让事情变得更具挑战性,我主要是.NET开发人员,因此我使用OpenTK OpenGL包装器在Mono中工作。在我的笔记本电脑上,我整理了一个程序,让用户使用几个着色器在一个简单的景观中走动,这些着色器实现了每顶点着色和光照以及纹理映射。一切都运行得很好,直到我在桌面上运行相同的程序。
灾难!什么都不会呈现!我已将程序切割到相机靠近原点的位置,指向 at 原点,然后渲染一个正方形(技术上是三角形扇形)。四合一完美呈现在我的笔记本电脑,着色,灯光,纹理等所有,但桌面呈现一个小的扭曲非方形四边形,颜色不正确,不受灯光影响,而且没有纹理。
我怀疑显卡有问题,因为无论我是启动到Ubuntu 10.10还是Win XP,我都会得到相同的结果。我确实发现,如果我将顶点着色器削减到只输出位置数据和片段着色器只输出纯色(白色),则四边形渲染正确。但是当我开始传入颜色数据时(无论我是否在片段着色器中使用它),顶点着色器的输出再次失真。着色器如下。我留下了预先存在的代码,但是注释掉了,这样你就可以知道我想要做什么了。我是glsl的菜鸟,所以代码可能要好得多。
我的笔记本电脑是老款联想T61p,配备迅驰(Core 2)Duo和运行Ubuntu 10.10的nVidia Quadro显卡 我的桌面有一个带有Radeon HD 4850 x2(单卡,双GPU)的i7,从Saphire双启动到Ubuntu 10.10和Windows XP。 XP和Ubuntu都会出现问题。
任何人都可以看到我错过的错误吗?我的HD 4850x2的“特殊”是什么?
string vertexShaderSource = @"
#version 330
precision highp float;
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
//uniform mat4 normal_matrix;
//uniform mat4 cmv_matrix; //Camera modelview. Light sources are transformed by this matrix.
//uniform vec3 ambient_color;
//uniform vec3 diffuse_color;
//uniform vec3 diffuse_direction;
in vec4 in_position;
in vec4 in_color;
//in vec3 in_normal;
//in vec3 in_tex_coords;
out vec4 varyingColor;
//out vec3 varyingTexCoords;
void main(void)
{
//Get surface normal in eye coordinates
//vec4 vEyeNormal = normal_matrix * vec4(in_normal, 0);
//Get vertex position in eye coordinates
//vec4 vPosition4 = modelview_matrix * vec4(in_position, 0);
//vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
//Get vector to light source in eye coordinates
//vec3 lightVecNormalized = normalize(diffuse_direction);
//vec3 vLightDir = normalize((cmv_matrix * vec4(lightVecNormalized, 0)).xyz);
//Dot product gives us diffuse intensity
//float diff = max(0.0, dot(vEyeNormal.xyz, vLightDir.xyz));
//Multiply intensity by diffuse color, force alpha to 1.0
//varyingColor.xyz = in_color * diff * diffuse_color.xyz;
varyingColor = in_color;
//varyingTexCoords = in_tex_coords;
gl_Position = projection_matrix * modelview_matrix * in_position;
}";
string fragmentShaderSource = @"
#version 330
//#extension GL_EXT_gpu_shader4 : enable
precision highp float;
//uniform sampler2DArray colorMap;
//in vec4 varyingColor;
//in vec3 varyingTexCoords;
out vec4 out_frag_color;
void main(void)
{
out_frag_color = vec4(1,1,1,1);
//out_frag_color = varyingColor;
//out_frag_color = vec4(varyingColor, 1) * texture(colorMap, varyingTexCoords.st);
//out_frag_color = vec4(varyingColor, 1) * texture(colorMap, vec3(varyingTexCoords.st, 0));
//out_frag_color = vec4(varyingColor, 1) * texture2DArray(colorMap, varyingTexCoords);
}";
请注意,在此代码中,颜色数据被接受但未实际使用。无论片段着色器是否使用varyColor,几何都输出相同(错误)。只有当我注释掉行varyingColor = in_color;
时才会正确输出几何图形。最初着色器接受了vec3输入,我只修改了它们以便在故障排除时使用vec4。
答案 0 :(得分:1)
事实证明,nVidia驱动程序按照着色器中列出的顺序保留输入,而AMD驱动程序按字母顺序对它们进行排序。我应该使用GetAttribLocation来获取位置。