-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