我一直在玩OpenGL的整整一週或同等學歷。 二維後,我現在嘗試3D。我想重現您可以在第三個視頻http://johnnylee.net/projects/wii/中看到的3D場景。
我已經很難讓所有的東西在紋理和深度上正常工作。深度測試在OpenGL中默認顛倒了,還是我弄錯了?
我有最近2的問題,有幾分視覺上產生同樣的影響:
- 一個與不使用3D我已經找到了2D的技術很好地融合紋理。
- 一個對象出現在頂部上方。 就像這裏的問題暴露:Depth Buffer in OpenGL
我已經解決了這兩個問題,但我想知道如果我得到正確的事情,尤其是第二點。
對於第一個,我想我已經得到了它。 我有一個圓形目標的圖像,光盤外有任何東西。它在OpenGL中很好的加載。一些(由於我的z排序問題)背後的其他目標遭受被我用來繪製它的自然方形四邊形的透明區域隱藏。
原因是紋理的每個部分都被認爲對於深度緩衝完全不透明。 使用glEnable(GL_ALPHA_TEST)
以及glAlphaFunc(GL_GREATER, 0.5f)
的測試使得紋理的alpha層充當每像素(布爾)不透明度指示符,並且因此使混合變得無用(因爲我的圖像具有布爾透明度)。
補充問題:順便說一下,有沒有一種方法指定alpha測試的不同來源比用於混合的alpha層?
二,我已經找到了解決我的問題。 在清除顏色和深度緩衝區之前,我已將默認深度設置爲0 glClearDepth(0.0f)
,並且我已使用「更大」深度函數glDepthFunc(GL_GREATER)
。
我覺得很奇怪的是,深度是1.0,深度函數默認爲「less」GL_LESS
。 我基本上反過來,以便我的對象不會顯示爲反向...
我沒見過這樣的黑客攻擊,但另一方面,我沒有看到任何對象被系統地繪製在錯誤的地方訂單,不管我給他們訂貨的順序是!
OK,這裏的代碼位(剝離下來,沒有太多的希望)是現在工作,我想:
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(600, 600); // Size of the OpenGL window
glutCreateWindow("OpenGL - 3D Test"); // Creates OpenGL Window
glutDisplayFunc(display);
glutReshapeFunc(reshape);
PngImage* pi = new PngImage(); // custom class that reads well PNG with transparency
pi->read_from_file("target.png");
GLuint texs[1];
glGenTextures(1, texs);
target_texture = texs[0];
glBindTexture(GL_TEXTURE_2D, target_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, pi->getGLInternalFormat(), pi->getWidth(), pi->getHeight(), 0, pi->getGLFormat(), GL_UNSIGNED_BYTE, pi->getTexels());
glutMainLoop(); // never returns!
return 0;
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1, 1, -1, 1);
gluPerspective(45.0, w/(GLdouble)h, 0.5, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void display(void) {
// The stared *** lines in this function make the (ugly?) fix for my second problem
glClearColor(0, 0, 0, 1.00);
glClearDepth(0); // ***
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_DEPTH_FUNC); // ***
glDepthFunc(GL_GREATER); // ***
draw_scene();
glutSwapBuffers();
glutPostRedisplay();
}
void draw_scene() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.5, 0, -3, 0, 0, 1, 0, 1, 0);
glColor4f(1.0, 1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_2D);
// The following 2 lines fix the first problem
glEnable(GL_ALPHA_TEST); // makes highly transparent parts
glAlphaFunc(GL_GREATER, 0.2f); // as not existent/not drawn
glBindTexture(GL_TEXTURE_2D, target_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Drawing a textured target
float x = 0, y = 0, z = 0, size = 0.2;
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(x-size, y-size, z);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(x+size, y-size, z);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(x+size, y+size, z);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(x-size, y+size, z);
glEnd();
// Drawing an textured target behind the other (but drawn after)
float x = 0, y = 0, z = 2, size = 0.2;
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(x-size, y-size, z);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(x+size, y-size, z);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(x+size, y+size, z);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(x-size, y+size, z);
glEnd();
}
我回答段落:1)我只倒置它倒置倒置!2)我正在測試兩個對象的渲染,一個在另一個之後,z = 2中的那個不應該被看到,但是在第一段的修復之前。3)我知道當我讀它時,但是我不太需要它。 4)*這是訣竅!它現在正在工作,而不必反轉深度!! *我基本上是一個2D代碼,我已經適應繪製3D,並且我排除了這條愚蠢的線。謝謝! – ofavre 2010-11-16 22:22:52