我正在使用OpenGL用C ++编写程序,根据用户输入来插入和编辑三角形。在屏幕上显示三角形之后,用户可以单击任何顶点,并通过按数字键来确定要分配给它的颜色。每个编号的键代表一种颜色,1可以是红色,2可以是蓝色,依此类推,直到9。
现在,我有了代码来确定他们单击了VBO中的哪个顶点,但是一旦识别出顶点,我不知道该怎么做。我知道我可以使用现在正在使用的glUniform3f,但这会使场景中的每个三角形都具有相同的颜色。
顶点着色器和片段着色器:
Program program;
const GLchar* vertex_shader =
"#version 150 core\n"
"in vec2 position;"
"void main()"
"{"
" gl_Position = vec4(position, 0.0, 1.0);"
"}";
const GLchar* fragment_shader =
"#version 150 core\n"
"out vec4 outColor;"
"uniform vec3 triangleColor;"
"void main()"
"{"
" outColor = vec4(triangleColor, 1.0);"
"}";
我是否需要为颜色创建第二个VBO?如果是这样,我如何设置代码以同时使用它们?我是OpenGL的新手,所以对您有帮助。
答案 0 :(得分:1)
我是否需要为颜色创建第二个VBO?如果是这样,我如何设置代码以同时使用它们?我是OpenGL的新手,所以对您有帮助。
可以。但是也可以在一个VBO中对顶点坐标和颜色进行编码。
无论如何,您都必须创建一个顶点着色器,该着色器的顶点坐标旁边还有第二个属性。此属性是与顶点坐标关联的颜色。并且必须传递到片段着色器(在以下Raw string literal中使用):
顶点着色器
const GLchar* vertex_shader = R"(
#version 150 core
in vec2 position;
in vec3 color;
out vec3 vColor;
void main()
{
vColor = color;
gl_Position = vec4(position, 0.0, 1.0);
}
)";
片段着色器
const GLchar* fragment_shader = R"(
#version 150 core
in vec3 vColor;
out vec4 outColor;
void main()
{
outColor = vec4(vColor.rgb, 1.0);
}
)";
C ++
GLuint program = ...;
glLinkProgram( program );
GLint position_inx = glGetAttribLocation(program, "position");
GLint color_inx = glGetAttribLocation(program, "color");
如果要使用2 Vertex Buffer Objects,其中第一个包含x和y坐标的顶点位置,第二个包含具有红色,绿色和蓝色通道的颜色,则定义数组通用顶点属性可能看起来像这样:
GLuint VBOpos = ....; // x0, y0, x1, y1, ...
GLuint VBOcol = ....; // r0, g0, b0, r1, g1, b1, ...
glBindBuffer( GL_ARRAY_BUFFER, VBOpos );
glEnableVertexAttribArray( position_inx );
glVertexAttribPointer(
position_inx,
2, GL_FLOAT, GL_FALSE, // 2 floats per coordinate
0, nullptr ); // tightly packed
glBindBuffer( GL_ARRAY_BUFFER, VBOcol );
glEnableVertexAttribArray( color_inx );
glVertexAttribPointer(
color_inx,
3, GL_FLOAT, GL_FALSE, // 3 floats per color
0, nullptr ); // tightly packed
如果要使用1 Vertex Buffer Objects,其中包含x和y坐标,后跟红色,绿色和蓝色通道,则通用顶点属性的数组定义可能如下所示:>
GLuint VBO = ....; // x0, y0, r0, g0, b0, x1, y1, r1, g1, b1, ...
glBindBuffer( GL_ARRAY_BUFFER, VBO );
glEnableVertexAttribArray( position_inx );
glVertexAttribPointer(
position_inx,
2, GL_FLOAT, GL_FALSE, // 2 floats per coordinate
5 * sizeof(float), // stride of 5 floats from one tuple to the next one
(void*)0 ); // offset of the vertex coordinates is 0
glEnableVertexAttribArray( color_inx );
glVertexAttribPointer(
color_inx,
3, GL_FLOAT, GL_FALSE, // 3 floats per color
5 * sizeof(float), // stride of 5 floats from one tuple to the next one
(void*)(2 * sizeof(float)); // offset of the color attribute is 2 * sizeof(float)