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,-1
到 1,1
,因此如果四边形大于该区域,则会绘制整个屏幕。
为了考虑矩阵堆栈(输入或 glRotate 和朋友),您需要在顶点着色器中将位置乘以 gl_ModelViewMatrix
。但是,这在 140 核中不可用,因此您要么需要兼容性,要么显式维护和传递矩阵。
我所做的着色器将整个屏幕着色为红色,而不是仅对正在绘制的四边形进行着色。这里描述了我在我的代码中做事的方式。
#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,-1
到 1,1
,因此如果四边形大于该区域,则会绘制整个屏幕。
为了考虑矩阵堆栈(输入或 glRotate 和朋友),您需要在顶点着色器中将位置乘以 gl_ModelViewMatrix
。但是,这在 140 核中不可用,因此您要么需要兼容性,要么显式维护和传递矩阵。