GLSL 着色:整个屏幕都是彩色的,而不仅仅是四边形

GLSL shading: The entire screen is colored instead of just a quad

我所做的着色器将整个屏幕着色为红色,而不是仅对正在绘制的四边形进行着色。这里描述了我在我的代码中做事的方式。

#version 140 core
// vertex shader
in vec3 position;
out vec3 color;

void main(void)
{
    gl_Position = vec4(position,1.0);
    color = vec3(1.0,0.0,0.0);
}

#version 140 core
// fragment shader
in vec3 color;

out vec4 outColor;

void main(void)
{
    outColor = vec4(color,0.1);
}

那么我做 vao vbo 的顺序是

/// vao buffer
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);

/// vbo - for vertices
glGenBuffers(1,&vbo1);
glBindBuffer(GL_ARRAY_BUFFER, ... );
glBufferData(GL_ARRAY_BUFFER, ...);
glVertexAttribPointer(0, 3, GL_FLOAT, ... );
glEnableVertexAttribArray(0);
glBindBuffer(0);

/// vbo for indices
glGenBuffers(1,&vbo2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ... );
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glVertexAttribPointer(1, 0, GL_UNSIGNED_INT);
glEnableVertexAttribArray(1);
glBindBuffer(0);

编译着色器程序,然后使用

绑定顶点位置
glBindAttribLocation(progID, 0, "position");

我想 "position" 与顶点着色器中的变量名称相同,并且它绑定到第 0 个位置,因为多边形的顶点位于 VAO 缓冲区中的第 0 个位置。我应该怎么解决这里的问题?

绘图区域为 -1,-11,1,因此如果四边形大于该区域,则会绘制整个屏幕。

为了考虑矩阵堆栈(输入或 glRotate 和朋友),您需要在顶点着色器中将位置乘以 gl_ModelViewMatrix。但是,这在 140 核中不可用,因此您要么需要兼容性,要么显式维护和传递矩阵。