2014-05-24 189 views
1

我有openGL調試的問題。我發現很多時候,OpenGL會通過不繪製任何東西來告訴你它失敗了。每次代碼看起來都不錯,但它不會在GL窗口上繪製任何東西。如何調試openGL代碼?

例如考慮下面的代碼。我寫它繪製立方體,但它沒有繪製任何東西,我無法找到原因。

============================================== ==========

// cube_vertex_array.cpp : Defines the entry point for the console application. 

#include "stdafx.h" 
#include <glut.h> 

static GLfloat vertex[]= 
         { 
          100.0,100.0,0.0, 
          400.0,100.0,0.0, 
          400.0,400.0,0.0, 
          100.0,400.0,0.0, 
          100.0,100.0,-300.0, 
          400.0,100.0,-300.0, 
          400.0,400.0,-300.0, 
          100.0,400.0,-300.0 
        }; 

static GLfloat color[]= 
         { 
          1.0,0.0,0.0, 
          0.0,1.0,0.0, 
          0.0,0.0,1.0, 
          1.0,1.0,0.0, 
          1.0,0.0,1.0, 
          0.0,1.0,1.0 
         }; 


static GLubyte frontIndices[] = {0,1,2,3}; 
static GLubyte leftIndices[] = {1,5,6,2}; 
static GLubyte backIndices[] = {4,7,6,5}; 
static GLubyte rightIndices[] = {0,3,7,4}; 
static GLubyte topIndices[] = {3,2,6,7}; 
static GLubyte bottomIndices[] = {0,4,5,1}; 

void init(void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0);        //Set default background color to black. 
    glClearDepth(2.0);          //Set the depth level for clearing depth buffer. 
    glShadeModel(GL_FLAT);         //Set the  shading model to FLAT 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the color and depth buffer. 
} 

void Display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the color and depth buffer. 

glColor3f(1.0,0.0,0.0); 

//glBegin(GL_LINE_STRIP); 
// glVertex3f(0.0,0.0,0.0); 
// glVertex3f(200.0,100.0,0.0); 
//glEnd(); 

glEnableClientState(GL_VERTEX_ARRAY);     //Enable vertex array. 
glEnableClientState(GL_COLOR_ARRAY);     //Enable vertex array color. 

glColorPointer(3,GL_FLOAT,0,color);      //Specify the array for colors. 
glVertexPointer(3,GL_FLOAT,0,vertex);     //Specify the array for vertex. 

glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,frontIndices);  //Draw front face. 
glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,leftIndices);  //Draw left face. 
glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,backIndices);  //Draw back face. 
glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,rightIndices);  //Draw right face. 
glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,topIndices);  //Draw top face. 
glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,bottomIndices);  //Draw bottom face. 

glutSwapBuffers();    //Swap the buffers. 
} 

void Reshape(int w,int h) 
{ 
    glViewport(0.0,(GLsizei)w,0.0,(GLsizei)h);   //Set the viewport according to new window size. 
    glMatrixMode(GL_PROJECTION);       //Set matrix mode to projection. 
    glLoadIdentity();         //Replace the top matrix in the stack to the identity matrix. 
    gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);   //Set the orthographic projection. 
    glMatrixMode(GL_MODELVIEW);       //Set matrix mode to modelview. 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc,argv);        //Initialize the glut. 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  //Set display mode and also enable double buffering. 
    glutInitWindowSize(500,500);      //Set the initial window size. 
    glutCreateWindow("Cube");       //Create the window and also assign name to it. 
    init();           //Initialize the app. 
    glutDisplayFunc(Display);       //Register the Display function. 
    glutReshapeFunc(Reshape);       //Register the Reshape function. 
    glutMainLoop();         //Start the main loop. 
    return 0; 
} 
+0

你可以使用KHR_debug_output(或在你的情況下,ARB_debug_output)來獲得更多關於OpenGL在做什麼的信息。此外,像glad(http://glad.dav1d.de/)這樣的特定綁定可以生成調試模式綁定,包含前後回調函數,可以在每次調用時自動檢查GL錯誤。 – Justin

回答

1

使用工具,如glTrace/glIntercept(看OpenGL的呼叫跟蹤),gDebugger(可視化紋理,着色器,OGL狀態等)

+0

Thanx的答案..我試過glIntercept,但我沒有找到什麼是我的代碼問題? – Piyush

2

你已將GL_UNSIGNED_BYTE作爲glDrawElements()中的類型參數。這將導致openGL將您引入的索引數組解釋爲每個索引一個字節。您應該在這裏使用GL_UNSIGNED_INT。

下面是基於代碼的工作代碼你提供的(我沒有將它移植到Java雖然):

import java.nio.ByteBuffer; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.LWJGLException; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

import static org.lwjgl.opengl.GL11.*; 

public class GLTest { 
    public static void main(String[] args) { 
     try { 
      Display.create(); 
      Display.setDisplayMode(new DisplayMode(500, 500)); 
      Display.setResizable(true); 

      //the same arrays as the ones you specified. 

      float[] vertices = new float[]{100.0f,100.0f,0.0f, 
        400.0f,100.0f,0.0f, 
        400.0f,400.0f,0.0f, 
        100.0f,400.0f,0.0f, 
        100.0f,100.0f,-300.0f, 
        400.0f,100.0f,-300.0f, 
        400.0f,400.0f,-300.0f, 
        100.0f,400.0f,-300.0f}; 

      float[] color = new float[]{1,0,0, 
        0,1,0, 
        0,0,1, 
        1,1,0, 
        1,0,1, 
        0,1,1}; 

      int[] frontIndices = new int[]{0, 1, 2, 3}; 


      //JWJGL bookkeeping.. 
      ByteBuffer vertexBuffer = BufferUtils.createByteBuffer(vertices.length * 4); 
      ByteBuffer colourBuffer = BufferUtils.createByteBuffer(color.length * 4); 

      for(int i = 0; i < vertices.length; i++) { 
       vertexBuffer.putFloat(vertices[i]); 
      } 
      vertexBuffer.rewind(); 

      for(int i = 0; i < color.length; i++) { 
       colourBuffer.putFloat(color[i]); 
      } 
      colourBuffer.rewind(); 


      ByteBuffer indexBuffer = BufferUtils.createByteBuffer(4 * frontIndices.length); 
      for(int i = 0; i < frontIndices.length; i++) { 
       indexBuffer.putInt(frontIndices[i]); 
      } 
      indexBuffer.rewind(); 

      //back you your code 

      glClearColor(1,1,1,1); 
      glShadeModel(GL_SMOOTH); 

      while(!Display.isCloseRequested()) { 
       glViewport(0, 0, Display.getWidth(), Display.getHeight()); 
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
       glMatrixMode(GL_PROJECTION); 
       glLoadIdentity(); 
       glOrtho(0,Display.getWidth(), 0, Display.getHeight(), -1, 1);  
       glMatrixMode(GL_MODELVIEW); 
       glLoadIdentity(); 

       glEnableClientState(GL_VERTEX_ARRAY);   
       glEnableClientState(GL_COLOR_ARRAY);   

       glColorPointer(3, GL_FLOAT, 0, colourBuffer);  
       glVertexPointer(3, GL_FLOAT, 0, vertexBuffer);   

       glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, indexBuffer);  
       Display.update(); 
       Display.sync(60); 
      } 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

導致:

enter image description here

1

有OpenGL的列表調試工具在這裏:https://www.opengl.org/wiki/Debugging_Tools

另外你的代碼是使用舊的固定管道,這被認爲是不贊成因爲OpenGL 3.3,所以我會建議不要把標籤「opengl-3」放在你的問題上,或者使用opengl 3.3核心上下文和學習「現代」OpenGL(這更強大,更難學,但讓你瞭解GPU工作)。