图片是小(黑色)正方形,应该是彩虹色的(将颜色从一种颜色换成另一种颜色),但为什么它变成黑色是愚蠢的。
因此它被绘制出来,而不是抛出错误。
下面是绘制一个黑色小方 block 的代码。
basic.vert 和 basic.frag 标准入门教科书(第一次考试)。
void My_TwoSquares()
{
GLfloat vertires[] =
{
-0.2f, -0.2f, 0.0f,
-0.2f, 0.2f, 0.0f,
0.2f, 0.2f, 0.0f,
0.2f, -0.2f, 0.0f,
};
// color
GLfloat cwet[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f
};
GLuint indices[] =
{
0,1,2,
0,2,3
};
GLuint iboHandle;
GLuint vaoHandle;
GLuint vboHandles[2];
glGenBuffers(2, vboHandles);
GLuint positionBufferHandle = vboHandles[0];
GLuint colorBufferHandle = vboHandles[1];
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), vertires, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), cwet, GL_STATIC_DRAW);
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glGenBuffers(1, &iboHandle);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboHandle);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLuint), indices, GL_STATIC_DRAW);
ShaderProgram shaderprogram;
shaderprogram.loadShaders("basic.vert", "basic.frag");
shaderprogram.use();
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
这是着色器 basic.frag 和 basic.vert
basic.frag
#version 330 core
uniform vec4 vertColor;
out vec4 frag_color;
void main()
{
frag_color = vertColor;
}
basic.vert
#version 330 core
layout (location = 0) in vec3 pos;
uniform vec2 posOffset;
void main()
{
gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}
最佳答案
在您的着色器代码中,vertColor
是一个 Uniform多变的。此统一变量永远不会设置,并且所有组件的统一变量的默认初始化为 0。这导致矩形被涂成黑色。
但是你有顶点属性。每个顶点坐标都与一种颜色相关联。您必须向 Vertex Shader 添加一个输入, 对于颜色属性 ( Vertex shader input )。
#version 330 core
layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;
此属性必须传递给 Fragment Shader , 通过顶点着色器的输出 ( Vertex shader output ),
out vec3 vColor;
void main()
{
vColor = color;
// [...]
}
片段着色器的输入(Fragment shader input):
in vec3 vColor;
顶点着色器的输出(如颜色)根据其在(三角形)图元(Barycentric coordinates)上的位置进行插值。片段着色器的输入是插值属性。
通过这种技术可以实现渐变色。
顶点着色器
#version 330 core
layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;
out vec3 vColor;
uniform vec2 posOffset;
void main()
{
vColor = color;
gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}
片段着色器
#version 330 core
in vec3 vColor;
out vec4 frag_color;
void main()
{
frag_color = vec4(vColor.rgb, 1.0);
}
关于c++ - 颜色在启动示例 opengl 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083836/