不久前,我拿起了OpenGL超级博客第五版的副本,并缓慢而痛苦地开始自学3.3的方式,因为它已经习惯了从学校回到学校的1.0路之后。使事情变得更具挑战性,我主要是一个.NET开发人员,因此我正在与Opentk OpenGL包装纸一起在Mono工作。在我的笔记本电脑上,我整理了一个程序,该程序让用户使用几个设计的阴暗器在简单的风景中行走,该着色器实现了每位vertex着色,照明和纹理映射。一切都很好,直到我在桌面上运行相同的程序为止。

灾难!什么都不会渲染!我将程序切碎到相机位于原点附近的地步,指着 起源并呈现一个正方形(从技术上讲,三角形粉丝)。四边形在我的笔记本电脑,颜色,照明,纹理等上完美地呈现,但是桌面呈现出一个很小的扭曲的非平方四边形,该四边形的颜色不正确,不受灯光的影响,并且不纹理。

我怀疑该图形卡是错误的,因为无论我被启动到Ubuntu 10.10还是Win XP,我都会得到相同的结果。我确实发现,如果我将顶点着色器缩减为仅输出位置数据和片段着色器,以仅输出固体颜色(白色),Quad呈正确呈现。但是,一旦我开始传递颜色数据(无论我是否在片段着色器中使用),顶点着色器的输出再次被扭曲。着色器跟随。我将预先存在的代码放在其中,但发表了评论,因此您可以了解我要做什么。我是GLSL的菜鸟,所以代码可能会好很多。

我的笔记本电脑是一款旧的Lenovo T61P,带有Centrino(Core 2)二人组(Core 2)二人组和运行Ubuntu的NVIDIA Quadro图形卡10.10我的桌面有一个i7,带有Radeon HD 4850 x2(单卡,Dual GPU),来自Saphire Dual dual in ubuntu 10.10和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);
}";

请注意,在此代码中,颜色数据被接受但实际上未使用。无论碎片着色器是否使用不同的颜色,几何形状都相同(错误)。只有我发表评论 varyingColor = in_color; 几何输出是否正确。最初,着色器接收了VEC3输入,我只修改了它们在故障排除时采用VEC4。

有帮助吗?

解决方案

事实证明,NVIDIA驱动程序以在HE着色器中列出的顺序留下输入,而AMD驱动程序则按字母顺序排序。我应该使用getAttriblocation来获取位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top