2015-06-15 47 views
2

我對着色器非常陌生,並且我得到了一些GLSL代碼來正確編譯(沒有任何編譯器錯誤),出於某種原因,我一直在黑屏。我正在使用LWJGL。當我嘗試渲染一個三角形時,我仍然會看到一個黑屏,儘管根據我傳遞給片段着色器的顏色它應該是白色的。我已經發布了下面的代碼片段,希望能夠找出問題所在。GLSL着色器只繪製黑色屏幕LWJGL

片段着色器源代碼

void main() 
{ 
    gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
{ 

頂點着色器的源代碼

void main() 
{ 
    gl_Position = ftransform(); 
} 

着色器閱讀器代碼

 vertShaderString = shaderName + ".vert"; 
     fragShaderString = shaderName + ".frag"; 
     shader = GL20.glCreateProgram(); 
     vertShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER); 

     try{ 
      String temp; 
      BufferedReader reader = new BufferedReader(new FileReader(new File(vertShaderString))); 
      while ((temp = reader.readLine()) != null){ 
       vertSource.append(temp).append("\n"); 
      } 
      reader.close(); 


      BufferedReader fragReader = new BufferedReader(new FileReader(new File(fragShaderString))); 
      String otherTemp; 
      while ((otherTemp = fragReader.readLine()) != null){ 
       fragSource.append(otherTemp).append("\n"); 
      } 
      fragReader.close(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

着色器設置代碼

 GL20.glShaderSource(vertShader, vertSource); 
     GL20.glCompileShader(vertShader); 

     if (GL20.glGetShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){ 
      System.err.println("Failed to compile vertex shader"); 
     } 


     GL20.glShaderSource(fragShader, fragSource); 
     GL20.glCompileShader(fragShader); 

     if (GL20.glGetShaderi(fragShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){ 
      System.err.println("Failed to compile fragment shader"); 
     } 

     GL20.glAttachShader(shader, vertShader); 
     GL20.glAttachShader(shader, fragShader); 
     GL20.glLinkProgram(shader); 
     GL20.glValidateProgram(shader); 

啓用和禁用着色器代碼

public void begin(){ 
    GL20.glUseProgram(shader); 
} 

public void end(){ 
    GL20.glUseProgram(0); 
} 

Render方法

public void render(){ 
     GL11.glClearColor(0, 0, 0, 1); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glColor4f(1, 0, 0, 1); 
     shader.begin(); 
     GL11.glBegin(GL11.GL_TRIANGLES); 
     GL11.glVertex2i(0, 0); 
     GL11.glVertex2i(500, 0); 
     GL11.glVertex2i(250, 250); 
     GL11.glEnd(); 
     shader.end(); 

    } 
+0

您應該檢查['GL_LINK_STATUS'](https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetProgramiv.xml)以及'GL_COMPILE_STATUS'。 [glGetError](https://www.opengl.org/sdk/docs/man3/xhtml/glGetError.xml)也非常有用。它是否在沒有着色器的情況下繪製?如果不是,它可能指向在投影/視圖之外繪圖。 – jozxyqk

+0

@jozxyqk它在沒有着色器的情況下編譯就好,但是當我使用着色器時,根本沒有任何東西被繪製。我像你說的那樣添加了標誌和glGetError()函數,但是我沒有在任何地方得到任何錯誤。 – user3140916

+2

缺少拼寫錯誤'{'在片段着色器中,可能是行'fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);'只是沒有顯示我無法找到任何明顯的東西。引入語法錯誤會停止着色器編譯嗎?你最近有沒有更新你的司機? – jozxyqk

回答

0

的問題已經解決了,感謝jozxyqk。我忘記了初始化片段着色器變量。

fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER); 

通過添加這行代碼,問題得以解決。