我正在编写一个现代的openGL模型加载器,并且使用除0以外的着色器属性位置遇到了一些问题。我可以将position属性放入着色器,但不是Blinn-Phong着色所需的值(绑定在计划到地点:Ks-3,Ka-4,Kd-5)。这是我用来加载和渲染OBJ模型的代码:
#version 330
in vec4 position;
in vec3 normals;
in vec2 texCoords;
uniform vec4 trans;
uniform mat4 view;
uniform mat4 projection;
uniform mat4 model;
void main()
{
gl_Position = projection*view* (position+trans);//-camera_position;
}
}
我认为我已将K-VBO正确绑定到正确的位置,但着色器将它们渲染为黑色。这是顶点着色器代码:
#version 330
out vec4 outputColor;
in vec3 Ks;
in vec3 Ka;
in vec3 Kd;
uniform mat4 view;
uniform mat4 projection;
void main()
{
if(Kd==vec3(0f)){
outputColor=vec4(0f);
}else{
outputColor=vec4(1f);
}
}
如果Kd的值为(0,0,0),则片段着色器输出黑色,否则为白色。在我的代码中,我检查并知道Kd是(.64,.64,.64) 片段着色器:
/user/<user name>/abcd
我找不到问题,但如果有人能做到这将是一个很大的帮助。谢谢!
答案 0 :(得分:4)
我没有详细查看您的代码,但似乎存在关于顶点属性如何工作的基本误解。在顶点着色器中,您有这些属性,看起来很好:
in vec4 position;
in vec3 normals;
in vec2 texCoords;
但是在片段着色器中,您有以下定义:
in vec3 Ks;
in vec3 Ka;
in vec3 Kd;
根据代码,您似乎计划将这些用作顶点属性。这不行。您无法将顶点属性直接提供给片段着色器。它们需要在顶点着色器中为in
个变量。如果需要片段着色器中的(插值)值,则需要使用顶点着色器中的out
变量和片段着色器中的in
变量将它们从顶点着色器传递到片段着色器。
如果您进行错误检查,我很惊讶您的着色器程序甚至链接。片段着色器中的in
个变量(至少只要它们在代码中使用)需要在顶点着色器中具有匹配的out
变量,而您没有这些变量。 Kd
。
当然,如果您的材料属性至少对于单个对象是恒定的,您也可以使它们成为制服而不是属性。
一旦解决了更基本的问题,需要注意的另一个方面是属性的位置。对于材质属性,您有值3,4和5的硬连线。您需要在着色器代码中使用glGetAttribLocation()
,glSetAttribLocation()
或location
限定符等调用,以确保用于glVertexAttribPointer()
等调用的位置与着色器程序中的属性位置。