我对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();
而不是蓝色方块下面的红色方块,我希望,这些电话给我一个蓝色方块的红色方块!
我不明白OpenGL渲染是如何工作的吗?或者我只是缺少某种选项或配置,不允许蓝色方块渲染?我正在使用自定义(但非常简单)的着色器,这会改变什么吗?
this问题未被接受的答案似乎暗示顺序呈现实际上并不发生并且是特定于实现的,但其接受的答案暗示事实确实如此。
将第二个电话打到最佳状态的最佳方式是什么?我真的不想拥有某种全局z值,我会在整个程序中不断增加。
答案 0 :(得分:4)
你调用的渲染函数将在已绘制的任何内容上绘制其形状。
没错。
我发现这似乎并非如此:
这对我有用:
#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;
}
与您的代码比较,看看是否存在差异。也许你并没有真正禁用depthtest。如果在代码中使用模板缓冲区参数的某些组合(类似glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
),则也可能会遇到同样的问题。如果您忘记使用glClear并在第一个和第二个多边形之间插入“swap buffers”调用,也可以获得相同的效果。
我正在使用自定义(但非常简单)的着色器,这会改变什么吗?
是的,它可以改变一切。但是,在这种情况下,这意味着您没有提供足够的信息来帮助您解决您的问题。如果您需要有关代码的帮助,则应发布完整和功能,但最小示例说明您的问题。 “忘记”发布这个例子是一个坏主意。