我试图在我的顶点着色器中找到属性的位置。当我打印位置时,得到0,-1和-1。 “ 0”对应于aPos变量。即使我将aPos变量向下移动,它仍会显示0。我读到-1表示找不到该变量。
这是我的代码:
// build and compile shaders
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
GLint status = GL_TRUE;
glGetShaderiv( vs, GL_COMPILE_STATUS, &status );
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);
GLuint shader_program = glCreateProgram(); //creating joint shader program
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);
GLint loc_pos = glGetAttribLocation( shader_program, "aPos" );
std::cout << "apos position: " << loc_pos << " ";
loc_pos = glGetAttribLocation( shader_program, "aNormal" );
std::cout << "normal position: " << loc_pos << " ";
loc_pos = glGetAttribLocation( shader_program, "TexCoords" );
std::cout << "texCoords position: " << loc_pos << " ";
这是我的顶点着色器:
#version 150 core
in vec3 aPos;
in vec3 aNormal;
in vec2 aTexCoords;
out vec2 TexCoords;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
TexCoords = aTexCoords;
gl_Position = projection * view * model * vec4(aPos, 1.0);
}
片段着色器:
#version 150 core
out vec4 FragColor;
in vec2 TexCoords;
uniform sampler2D texture_diffuse1;
void main()
{
FragColor = texture(texture_diffuse1, TexCoords);
//FragColor = vec4(1.0);
}
任何帮助将不胜感激!
答案 0 :(得分:1)
您不会获得aNormal
的位置,因为aNormal
不是活动的程序资源,因为它不是在顶点着色器中“使用”的。因此,驱动程序优化掉了属性aNormal
并没有获得属性索引。
如果您未在片段着色器中使用TexCoords
,则aTexCoords
的情况也是如此,如果TexCoords
未“使用”,则aTexCoords
不是“也使用”。
请参见OpenGL 4.6 Core Profile Specification - 7.3.1 Program Interfaces,第102页:
7.3.1程序接口
当程序对象成为当前渲染状态的一部分时,其可执行代码可以通过各种接口与其他GL管道阶段或应用程序代码进行通信。链接程序后,GL将为每个接口构建活动资源列表。活动资源的示例包括着色器代码使用的变量,接口块和子例程。在着色器代码中引用的资源被认为是活动的,除非编译器和链接器可以最终确定它们对程序的可执行代码产生的结果没有可观察的影响。
代码
loc_pos = glGetAttribLocation( shader_program, "TexCoords" );
返回-1,因为"TexCoords"
不是属性的名称。该属性的名称是"aTexCoords"
,而不是"TexCoords"
。