颜色在开始示例opengl中不起作用
Posted
技术标签:
【中文标题】颜色在开始示例opengl中不起作用【英文标题】:Color does not work in starting examples opengl 【发布时间】:2019-01-08 00:39:52 【问题描述】:图片是小(黑色)正方形,应该是彩虹色的(从一种颜色改变到另一种颜色)但是为什么它是愚蠢的黑色。
因此它从被绘制出来,而不是抛出一个错误。
这里是绘制黑色小方块的代码。
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);
【问题讨论】:
着色器代码有什么作用? 请使用 basic.vert 和 basic.frag 中的代码编辑您的帖子。 @Anonymous1847 插入着色器:3 @Rabbid76 插入着色器:3 【参考方案1】:在您的着色器代码中,vertColor
是一个 Uniform 变量。这个统一变量永远不会被设置,并且统一变量的默认初始化对于所有组件都是 0。这会导致矩形被涂成黑色。
但是你有顶点属性。每个顶点坐标都与一种颜色相关联。您必须为颜色属性 (Vertex shader input) 添加一个输入到 Vertex Shader。
#version 330 core
layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;
该属性必须通过顶点着色器的输出 (Vertex shader output) 传递给 Fragment Shader,
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);
【讨论】:
以上是关于颜色在开始示例opengl中不起作用的主要内容,如果未能解决你的问题,请参考以下文章