-1

我們的應用程序崩潰..Nvidia的老司機,調用glDrawArrays異常訪問衝突舊的Nvidia驅動程序

調試代碼here

放眼望去,here他們說,這往往是由於不正確的頂點屬性設置

這是怎麼設置我的VBO和維羅:

 /** 
     * Init Vbo/vao. 
     */ 
     float[] vertexData = new float[]{ 
      0, 0, 
      1, 0, 
      1, 1}; 

     debugVbo = new int[1]; 
     gl3.glGenBuffers(1, debugVbo, 0); 

     gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, debugVbo[0]); 
     { 
      FloatBuffer buffer = GLBuffers.newDirectFloatBuffer(vertexData); 

      gl3.glBufferData(GL3.GL_ARRAY_BUFFER, vertexData.length * Float.BYTES, buffer, GL3.GL_STATIC_DRAW); 
     } 
     gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); 

     debugVao = new int[1]; 
     gl3.glGenVertexArrays(1, debugVao, 0); 
     gl3.glBindVertexArray(debugVao[0]); 
     { 
      gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, debugVbo[0]); 
      { 
       gl3.glEnableVertexAttribArray(0); 
       { 
        gl3.glVertexAttribPointer(0, 2, GL3.GL_FLOAT, false, 0, 0); 
       } 
      } 
      gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); 
     } 
     gl3.glBindVertexArray(0); 
    } 

這就是我的呈現方式:

public static void render(GL3 gl3) { 

gl3.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT); 

gl3.glUseProgram(textureProgram); 
{ 
    gl3.glBindVertexArray(debugVao[0]); 
    { 
     gl3.glActiveTexture(GL3.GL_TEXTURE0); 
     gl3.glBindTexture(GL3.GL_TEXTURE_2D, texture[0]); 
     gl3.glBindSampler(0, EC_Samplers.pool[EC_Samplers.Id.clampToEdge_nearest_0maxAn.ordinal()]); 
     { 
      gl3.glDrawArrays(GL3.GL_TRIANGLES, 0, 3); 
     } 
     gl3.glBindTexture(GL3.GL_TEXTURE_2D, 0); 
     gl3.glBindSampler(0, 0); 
    } 
    gl3.glBindVertexArray(0); 
} 
gl3.glUseProgram(0); 
} 

這是我的VS:

#version 330 

layout (location = 0) in vec2 position; 

uniform mat4 modelToCameraMatrix; 
uniform mat4 cameraToClipMatrix; 

out vec2 fragmentUV; 

void main() 
{ 
    gl_Position = cameraToClipMatrix * modelToCameraMatrix * vec4(position, 0, 1); 

    fragmentUV = position; 
} 

我的FS:

#version 330 

in vec2 fragmentUV; 

out vec4 outputColor; 

uniform sampler2D textureNode; 

void main() 
{ 
    outputColor = texture(textureNode, fragmentUV); 
} 

我讀和重讀,因爲現在2天相同的代碼,我無法找到任何東西錯誤。 我也試着定義一個2 * 4 = 8的步幅,但是結果相同..

+0

到目前爲止,您的代碼看起來正確,但我建議您使用glGetError調用(每個常規OpenGL調用後調用它)看看它究竟在哪裏失敗。有些奇怪的事情正在發生。另外對於快速測試,我建議你在* drawing *代碼中設置一個完整的頂點attrib指針,而不是依賴於VAO;如果這樣的話,你知道VAO正在發生什麼。 – datenwolf

+0

嘗試完整的頂點attrib指針設置。我會嘗試glGetError噴塗,謝謝 – elect

+0

誰-1ed,你介意解釋嗎? – elect

回答

1

我簡直不敢相信。

問題騙別的地方,我在那裏初始化我的採樣

public static void init(GL3 gl3) { 

    pool = new int[Id.size.ordinal()]; 

    gl3.glGenSamplers(Id.size.ordinal(), pool, 0); 

    gl3.glSamplerParameteri(pool[Id.clampToEdge_nearest_0maxAn.ordinal()], 
      GL3.GL_TEXTURE_WRAP_S, GL3.GL_CLAMP_TO_EDGE); 
    gl3.glSamplerParameteri(pool[Id.clampToEdge_nearest_0maxAn.ordinal()], 
      GL3.GL_TEXTURE_WRAP_T, GL3.GL_CLAMP_TO_EDGE); 
    gl3.glSamplerParameteri(pool[Id.clampToEdge_nearest_0maxAn.ordinal()], 
      GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_NEAREST); 
    gl3.glSamplerParameteri(pool[Id.clampToEdge_nearest_0maxAn.ordinal()], 
      GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_NEAREST); 
    gl3.glSamplerParameteri(pool[Id.clampToEdge_nearest_0maxAn.ordinal()], 
      GL3.GL_TEXTURE_MAX_ANISOTROPY_EXT, 0); 
} 

墜毀是由最大各向異性設置爲0引起... 1解決了崩潰..

PS:也glSamplerParameterf而不是glSamplerParameteri因爲它是一個浮點值..

無論如何,這是奇怪的,因爲該代碼是因爲很多時間以來,從未觸發違規事先..我不知道..也許一些後來的代碼修改Nvidia驅動程序無法檢測到問題並自行解決問題的方式,誰知道..

+0

設置無效值不應導致OpenGL驅動程序崩潰。產生錯誤:是的。崩潰:大不! – datenwolf