2013-06-05 60 views
1

我目前正在通過當前的OpenGL編程指南4.3版。我實現了第一個例子的代碼,它應該顯示兩個三角形。基本上很簡單。OpenGL沒有按預期繪製

但是,當我運行該代碼(只是黑色的窗口)時沒有顯示任何內容。

這是三角形創建初始化函數:

GLuint vertexArrayObjects[1]; 
GLuint buffers[1]; 
const GLuint vertexCount = 6; 

void init() { 
// glClearColor(0,0,0,0); 

    glGenVertexArrays(1, vertexArrayObjects); 
    glBindVertexArray(vertexArrayObjects[0]); 

    GLfloat vertices[vertexCount][1] { 
     {-90.0, -90.0}, 
     { 85.0, -90.0}, 
     {-90.0, 85.0}, 
     { 90.0, -85.0}, 
     { 90.0, 90.0}, 
     {-85.0, 90.0} 
    }; 

    glGenBuffers(1, buffers); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    ShaderInfo shaders[] { 
     {GL_VERTEX_SHADER, "one.vsh"}, 
     {GL_FRAGMENT_SHADER, "one.fsh"}, 
     {GL_NONE, nullptr} 
    }; 

    GLuint program = LoadShaders(shaders); 
    glUseProgram(program); 

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, ((char *)NULL + (0))); 
    glEnableVertexAttribArray(0); 
} 

而且非常簡單的抽獎:

void display() { 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBindVertexArray(vertexArrayObjects[0]); 
    glDrawArrays(GL_TRIANGLES, 0, vertexCount); 

    glFlush(); 
} 

但正如所說,沒有什麼是畫。我的實施中是否有錯誤?

完整的代碼是here和LoadShaders(直接從書籍網站,所以這應該是出於興趣)是here。 着色器是here

+0

這是一個遠射,但我沒有看到任何'glViewport'。也許也關閉臉部剔除(我從來不記得默認是什麼) – Grimmy

+0

@Grimmy剔除似乎是默認關閉。本書中的例子應該沒​​有視口,它的代碼中沒有任何地方,我還沒有看到更難的例子。 – Appleshell

回答

0

嗯,我想出了問題。該應用程序在構建時運行在與源代碼完全不同的位置,並且着色器文件不會複製到目標目錄中。因此,程序顯然不能讀取它們,也不會顯示任何內容。用絕對路徑替換相對着色器路徑one.vshone.fsh解決了問題。

0

對於書中的第一個例子,沒有應用變換(即在頂點着色器中,頂點的位置vPosition直接映射到輸出位置gl_Position)。因此,該窗口的座標系是標準化的設備座標。只有座標在[-1,1]之間的對象在x之間纔會被傳遞給光柵化器(而不是剪裁)。考慮到您在程序中指定的幾何圖形,您渲染的三角形完全覆蓋了視口,所以您應該看到您在片段着色器中指定的顏色(藍色)。

否則,你的代碼看起來是正確的。 (儘管您不需要將nullptr加入LoadShaders的着色器列表中,但只能查找GL_NONE)。

+0

你說得對,座標應該是'0.xx'而不是'xx.0'。儘管如此,窗戶仍然是黑色的...... – Appleshell