OpenGL VAO多个VBO绑定问题

时间:2015-09-24 00:22:49

标签: java opengl glsl lwjgl

我正在编写一个现代的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

我找不到问题,但如果有人能做到这将是一个很大的帮助。谢谢!

1 个答案:

答案 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()等调用的位置与着色器程序中的属性位置。