gpt4 book ai didi

opengl-4 - 如何为带有索引顶点的三角形着色

转载 作者:行者123 更新时间:2023-12-02 01:03:54 24 4
gpt4 key购买 nike

我有一个绘制四面体的应用程序

glDrawElements(GL_TRIANGLES,...)

我现在想为四面体的每个面着色。

如果我理解正确,我必须将我的 4 个顶点一式三份,以便每个面都有“唯一”的顶点,可以为其分配相同的颜色值。

目前我像这样处理顶点和它们的索引

    glGenBuffers(1, &position_buffer);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_positions),
vertex_positions,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);

glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(vertex_indices),
vertex_indices,
GL_STATIC_DRAW);

在顶点着色器中访问顶点

 in vec4 position;

我应该在额外的 GL_ARRAY_BUFFER 中传递颜色吗?

如果是,我可以使用相同的 GL_ELEMENT_ARRAY_BUFFER(并使用 glEnableVertexAttribArray(1))吗?

我怎样才能从顶点着色器内部访问颜色?

最佳答案

Should i pass the colors in an additional GL_ARRAY_BUFFER?

一般来说,你必须有多种可能性,

要么你有 2 个缓冲区,一个单独的顶点缓冲区和颜色缓冲区:

GLuint vertex_attr_inx = 0;
GLuint color_attr_inx = 1;

GLfloat vertex_positions[] = .... ; // x0, y0, z0, x1, y1, z1, ...
GLfloat vertex_colors[] = .... ; // R0, G0, B0, A0, R1, G1, B1, A1, ...

GLuint vbo[2];
glGenBuffers(2, vbo);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions), vertex_positions, GL_STATIC_DRAW);
glVertexAttribPointer(vertex_attr_inx, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(vertex_attr_inx);

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_colors), vertex_colors, GL_STATIC_DRAW);
glVertexAttribPointer(color_attr_inx, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(color_attr_inx);

或者你有一个用于顶点位置和颜色属性的组合缓冲区:

GLfloat vertex_attributes[] = ; // x0, y0, z0, R0, G0, B0, A0, x1, y1, z1, R1, G1, B1, A1, ...

GLsizei attrSize = 7*sizeof(float); // 7 -> x, y, z, R, G, B, A
GLsizei colorOffs = 3*sizeof(float);

GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_attributes), vertex_attributes, GL_STATIC_DRAW);

glVertexAttribPointer(vertex_attr_inx, 3, GL_FLOAT, GL_FALSE, attrSize, 0);
glEnableVertexAttribArray(vertex_attr_inx);

glVertexAttribPointer(color_attr_inx, 4, GL_FLOAT, GL_FALSE, attrSize, colorOffs);
glEnableVertexAttribArray(color_attr_inx);


在顶点着色器中,您必须使用 2 个属性。

我建议使用布局位置来指定属性索引(至少需要 GLSL 版本 3.30;应该是这种情况,因为您将问题标记为“opengl-4”):

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;

当然你也可以查询属性位置,对于早期版本的OpenGL/GLSL(blow OpenGL 3.3和GLSL 3.30):

in vec4 position;
in vec4 color;

GLuint vertex_attr_inx = glGetAttribLocation( shaderProgram, "position" );
GLuint color_attr_inx = glGetAttribLocation( shaderProgram, "color" );



If yes, can i use the same GL_ELEMENT_ARRAY_BUFFER?

索引缓冲区 (GL_ELEMNT_ARRAY_BUFFER) 在这两种情况下都是相同的。您可以按原样使用您的问题代码。

glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_indices), vertex_indices, GL_STATIC_DRAW);

关于opengl-4 - 如何为带有索引顶点的三角形着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com