-1
混合在我的程序中的深度和混合使能,所以他們將互相影響得到最終結果,有兩個矩形紅色和藍色,紅色更接近視點。在三維
當紅色首先繪製成爲不透明物體並遮擋藍色,但是當首先繪製藍色時,紅色變爲半透明物體並與藍色混合。
我的解釋是當紅色繪製第一個藍色不會繪製,因爲深度緩衝區,但在第二個狀態藍色將有機會被繪製,並將與紅色混合。
這種解釋提出了一個問題,這是我真正的問題:
爲什麼當藍色的第一引出雖然它是更接近觀察點,而在第一狀態紅不紅透亮透亮成爲?
進入這裏
#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;
}
你主要是那個藍色矩形沒有失敗與紅色矩形的深度測試,因此它已被繪製並與紅色矩形混合? – user1841718
@ user1841718:情況正是如此。但是紅色的長方形沒有通過深度測試,所以沒有畫出任何東西,而是留下了藍色矩形的混合以及任何繪製過的東西。 OpenGL不是一個場景圖,它沒有世界的概念。所有OpenGL知道的是繪製點,線或三角形,一次一個到操作系統提供的畫布。它主要是煙霧和鏡子,深度測試是實現隱藏表面去除的廉價而簡單的方法,其價格無法做到與訂單無關的透明度,而這仍然是一個正在進行的研究課題。 – datenwolf