在我的程序中,深度和混合被启用,因此它们将相互影响以获得最终结果,有两个矩形红色和蓝色,红色更接近视点。
当首先绘制红色变为不透明物体并遮挡蓝色时,但是当首先绘制蓝色时,红色变为半透明物体并与蓝色混合。
我的解释是,当先画红色然后由于深度缓冲而不会绘制蓝色,但在第二个状态下,蓝色将有机会被绘制并将与红色混合。
这种解释提出了一个问题,这是我真正的问题:
为什么当蓝色首先绘制时红色变为半透明但是在第一个状态红色不是半透明时更接近视点?
在这里输入代码
#include <glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClearDepth(1.0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_DEPTH_TEST);
}
void v(void);
void Red(void)
{
glColor4f(1.0,0.0,0.0,1.0);
glBegin(GL_POLYGON);
glVertex3f(0.5,0.5,-0.8);
glVertex3f(-0.5,0.5,-0.8);
glVertex3f(-0.5,-0.5,-0.8);
glVertex3f(0.5,-0.5,-0.8);
glEnd();
glFlush();
}
void Blue(void)
{
glColor4f(0.0,0.0,1.0,0.5);
glBegin(GL_POLYGON);
glVertex3f(0.5,0.5,-0.7);
glVertex3f(-0.5,0.5,-0.7);
glVertex3f(-0.5,-0.5,-0.7);
glVertex3f(0.5,-0.5,-0.7);
glEnd();
glFlush();
}
void Display(void)
{
v();
Red();
Blue();
}
void v()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,1.0,-1.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (200, 200);
glutCreateWindow (argv[0]);
init();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}
答案 0 :(得分:2)
为什么当蓝色首先绘制时红色变为半透明但是在第一个状态红色不是半透明时更接近视点?
因为深度测试和混合不混合。深度测试仅基于其深度值丢弃片段(例如原始像素)。如果传入的片段未通过深度测试,则会被丢弃。
然而,无意识地混合只是将帧缓冲区的像素颜色与传入的片段组合在一起。如果片段被丢弃,则没有任何反应。
实际上,这意味着,当深度测试失败时,您无法追溯性地混合。这意味着,通过混合,您只能使用深度测试来遮挡 opaque 几何体。但是你不进行深度写入,你必须在绘制之前将所有东西排序到远近。