gpt4 book ai didi

c++ - 没有 glVertexPointer,通用顶点属性缓冲区似乎不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:04:04 25 4
gpt4 key购买 nike

我正在绘制一个交错缓冲区——它是一个通用的顶点属性缓冲区。布局由三个 float 作为顶点坐标,以及另外两个 float 属性组成,交错如下:

| float    | float    | float    | float   | float   |
| coords.x | coords.y | coords.z | attrib1 | attrib2 |
|_______vertex coordinates_______|_________|_________|

我希望能够只用 glVertexAttribPointer 来绘制它,这似乎确实有效 - 然而,只有当我也使用 glEnableClientState 时它才有效(GL_VERTEX_ARRAY)glVertexPointer(),即使我没有在着色器中访问 gl_Vertex!

最小顶点着色器(GLSL 1.20):

#version 120

attribute vec3 coords;
attribute float attrib1;
attribute float attrib2;

void main() {
gl_Position = gl_ModelViewProjectionMatrix * vec4(coords.x, coords.y, coords.z, 1.0);
// attrib1 and 2 are used here but this is not relevant
}

绘制缓冲区的代码:

// set up states
glUseProgram(shader);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLuint shader_att0 = glGetAttribLocation(shader, "coords");
GLuint shader_att1 = glGetAttribLocation(shader, "attrib1");
GLuint shader_att2 = glGetAttribLocation(shader, "attrib2");
glEnableVertexAttribArray(shader_att0);
glEnableVertexAttribArray(shader_att1);
glEnableVertexAttribArray(shader_att2);
// *** These two lines below should not be necessary: ***
//glEnableClientState(GL_VERTEX_ARRAY);
//glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), reinterpret_cast<void*>(0));
// *** ...but without them, nothing is drawn! ***
glVertexAttribPointer(shader_att0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), reinterpret_cast<void*>(0)); // 0: vertex coords
glVertexAttribPointer(shader_att1, 1, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), reinterpret_cast<void*>(3 * sizeof(GLfloat))); // 1: attrib1
glVertexAttribPointer(shader_att2, 1, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), reinterpret_cast<void*>(4 * sizeof(GLfloat))); // 2: attrib2

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

// do the drawing
glDrawElements(GL_TRIANGLES, numverts, GL_UNSIGNED_INT, 0);

// revert all the states again
glUseProgram(0);
glDisableVertexAttribArray(shader_att0);
glDisableVertexAttribArray(shader_att1);
glDisableVertexAttribArray(shader_att2);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

在上面的代码中一切正常如果我取消注释这两个带注释的行;否则,不绘制任何内容。

这真的让我很困惑...我是否错过了某个地方的某些状态更改或者是否有什么我忘记启用的?

编辑:我没有使用 VAO,除了您在这里看到的之外,没有设置其他状态。没有绑定(bind)纹理或其他缓冲区。

最佳答案

来自评论中链接的着色器代码:

#version 120
#pragma optimize(on)
#pragma debug(on)

attribute vec4 coords; // we only input a vec3, so w defaults to 1.0
attribute float lambertian_main;
attribute float lambertian_side;

varying float height;
varying float lambertian_main_frag;
varying float lambertian_side_frag;

void main() {
gl_Position = gl_ModelViewProjectionMatrix * coords;
lambertian_main_frag = lambertian_main;
lambertian_side_frag = lambertian_side;
height = gl_Vertex.y;
}

在这里使用gl_Vertex...如果使用它,它将始终获得属性 ID 0。这完全解释了您所看到的行为并描述了两者在问题和评论中。只需使用 height = coords.y,一切都会像您期望的那样工作。

关于c++ - 没有 glVertexPointer,通用顶点属性缓冲区似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796315/

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