我对 OpenGL 渲染的理解是,如果没有深度测试,对象将按顺序绘制,因此您调用的最后一个渲染函数将在已经绘制的任何内容之上绘制其形状。然而,我发现情况似乎并非如此:
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
{
glVertex2f(50, 50);
glVertex2f(100, 50);
glVertex2f(100, 100);
glVertex2f(50, 100);
}
glEnd();
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
{
glVertex2f(30, 60);
glVertex2f(110, 60);
glVertex2f(110, 90);
glVertex2f(30, 90);
}
glEnd();
而不是蓝色方 block 下面的红色方 block ,正如我所期望的那样,这些调用在蓝色方 block 之上给我一个红色方 block !
难道我不明白 OpenGL 渲染的工作原理吗?还是我只是缺少某种不让蓝色方 block 渲染的选项或配置?我正在使用自定义(但非常简单)着色器,这会改变什么吗?
this 的未被接受的答案问题似乎暗示顺序渲染实际上并没有发生并且是特定于实现的,但其接受的答案暗示事实确实如此。
在顶部进行第二次调用的最佳方法是什么?我真的不想拥有某种在整个程序中不断递增的全局 z 值。
最佳答案
render function you call will draw its shape on top of whatever has already been drawn.
没错。
I'm finding that this seems to not be the case however:
这对我有用:
#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
static int scrWidth = 640;
static int scrHeight = 480;
int main(int argc, char** argv){
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
SDL_Quit();
return -1;
}
glewInit();
SDL_ShowCursor(SDL_DISABLE);
glClearColor(0.2, 0.2, 0.2, 0.2);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
bool running = true;
while (running){
SDL_Event event;
if (SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
running = false;
break;
};
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, scrWidth, scrHeight, 0);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glVertex2f(50, 50);
glVertex2f(100, 50);
glVertex2f(100, 100);
glVertex2f(50, 100);
glEnd();
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
glVertex2f(30, 60);
glVertex2f(110, 60);
glVertex2f(110, 90);
glVertex2f(30, 90);
glEnd();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFlush();
SDL_GL_SwapBuffers();
}
SDL_Quit();
return 0;
}
与您的代码进行比较,看看是否存在差异。也许您并没有真正禁用深度测试。如果您在代码中使用带有特定模板缓冲区参数组合的模板缓冲区(类似于 glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff));glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
,您也可能遇到同样的问题).如果您忘记使用 glClear 并在第一个和第二个多边形之间插入“交换缓冲区”调用,您也可以获得相同的效果。
am using a custom (but very simple) shader, would that change anything?
是的,它可以改变一切。但是,在这种情况下,这意味着您没有提供足够的信息来帮助您解决您的问题。当您需要有关代码的帮助时,您应该发布完整 和功能性,但最小 示例来说明您的问题。 “忘记”发布这个例子是个坏主意。
关于c++ - OpenGL 后端渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858987/