gpt4 book ai didi

c - OpenGL Ubuntu 深度

转载 作者:行者123 更新时间:2023-11-30 16:44:31 28 4
gpt4 key购买 nike

我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出​​现在前面的物体前面。深度缓冲区启用

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

GL_DEPTH_TEST 启用方式

glEnable(GL_DEPTH_TEST);

并且深度缓冲区在绘制之前被清除

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

完整代码如下:

#define BUFFER_OFFSET( offset )   ((GLvoid*) (offset))

#define NUM_VERTICES 8

vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0}, // front
{0.0, 0.5, -0.25, 1.0},
{0.5, 0.5, -0.25, 1.0},
{0.5, 0.0, -0.25, 1.0},
{0.25, 0.25, -0.75, 1.0}, // back
{0.25, 0.75, -0.75, 1.0},
{0.75, 0.75, -0.75, 1.0},
{0.75, 0.25, -0.75, 1.0}};

vec4 vertex_colors[8] =
{{1.0, 0.0, 0.0, 1.0}, // red
{1.0, 0.0, 0.0, 1.0},
{1.0, 0.0, 0.0, 1.0},
{1.0, 0.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0}, // green
{0.0, 1.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0}};

void init(void)
{
GLuint program = initShader("vshader_td.glsl", "fshader_td.glsl");
glUseProgram(program);

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertex_colors), vertex_colors);

GLuint vPosition = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(vPosition);
glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

GLuint vColor = glGetAttribLocation(program, "vColor");
glEnableVertexAttribArray(vColor);
glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points)));

glEnable(GL_DEPTH_TEST);
glClearColor(1.0, 1.0, 1.0, 1.0);
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_QUADS, 0, NUM_VERTICES);
glutSwapBuffers();
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(512, 512);
glutCreateWindow("Test Depth");
glewInit();
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

顶点着色器如下所示: #版本130

in vec4 vPosition;
in vec4 vColor;
out vec4 color;

void main()
{
color = vColor;
gl_Position = vPosition;
}

片段着色器如下所示: #版本130

in vec4 color;
out vec4 fColor;

void main()
{
fColor = color;
}

为什么前面的物体会被后面的物体挡住?

最佳答案

在顶点着色器中,您可以这样做

in vec4 vPosition;
[....]
gl_Position = vPosition;

不应用任何转换。由于 gl_Position 是顶点的剪辑空间位置,这意味着您的顶点坐标将被解释为在剪辑空间中指定。

以及你的顶点坐标

vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0}, // front
[...]
{0.25, 0.25, -0.75, 1.0}, // back

只是暗示您标记为“前面”的点位于您标记为“后面”的点后面

我不知道你是如何得出应该是相反的假设的,我只能猜测你将其与经典的左手 OpenGL 眼空间约定混淆了,其中“相机:查看 -z方向 - 但这在这里完全无关,因为你根本没有建立眼睛空间,并直接在剪辑空间中绘制。

关于c - OpenGL Ubuntu 深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44449302/

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