2014-11-11 2 views
0

에서 작동하며 오류가
Error Message
Console Log
이 프로그램은 예전 AMD 라데온 HD에 구성 6970. 며칠로 일했다 "nvoglv64.dll에서 액세스 위반 읽기 위치"입니다 전에 GTX 970을 구입했습니다. 좋은 카드 였지만, 제 프로그램이 잘되기를 바랍니다. 지연 렌더링을 위해 화면에 쿼드를 렌더링하고 싶습니다.는 OpenGL 프로그램은 AMD에 있지만 NVIDIA

// The following three lines are called in the render loop (as 2nd pass). 
// I skip rendering meshes in the first pass to better understand this error. 
//sp->useSubRoutine(srp2); // SP is the shader program 
//sp->resetMatrices(); // Set matrices to mat4(1.0); 
//dq->render(); // DQ is the display quad 


glBindFramebuffer(GL_FRAMEBUFFER, fbo); // fbo is 0 for quad 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glDisable(GL_DEPTH_TEST); 

if (shader != nullptr) 
{ 
    shader->use(); 
    shader->setModelMatrix(modelMatrix); 
} 

if (is2D) 
{ 
    glBindVertexArray(array2D); 
    glDrawArrays(GL_TRIANGLES, 0, indexCount); // ERROR HERE 
    return; 
} 



버텍스 쉐이더 : 쿼드 렌더링

modelMatrix = mat4(1.0); 

vertices.push_back(vec3(-1.0f, -1.0f, 0.0f)); 
vertices.push_back(vec3(1.0f, -1.0f, 0.0f)); 
vertices.push_back(vec3(1.0f, 1.0f, 0.0f)); 

vertices.push_back(vec3(-1.0f, -1.0f, 0.0f)); 
vertices.push_back(vec3(1.0f, 1.0f, 0.0f)); 
vertices.push_back(vec3(-1.0f, 1.0f, 0.0f)); 

normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 
normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 
normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 

normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 
normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 
normals.push_back(vec3(0.0f, 0.0f, 1.0f)); 

indices.push_back(0); 
indices.push_back(1); 
indices.push_back(2); 

indices.push_back(0); 
indices.push_back(2); 
indices.push_back(3); 

uvs.push_back(vec2(0.0f, 0.0f)); 
uvs.push_back(vec2(1.0f, 0.0f)); 
uvs.push_back(vec2(1.0f, 1.0f)); 

uvs.push_back(vec2(0.0f, 0.0f)); 
uvs.push_back(vec2(1.0f, 1.0f)); 
uvs.push_back(vec2(0.0f, 1.0f)); 

indexCount = static_cast<int>(indices.size()); 
is2D = true; 

unsigned int handle[2]; 
glGenBuffers(2, handle); 

glBindBuffer(GL_ARRAY_BUFFER, handle[0]); 
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, handle[1]); 
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW); 

glGenVertexArrays(1, &array2D); 
glBindVertexArray(array2D); 

glBindBuffer(GL_ARRAY_BUFFER, handle[0]); 
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0))); 
glEnableVertexAttribArray(0); // Vertex position 

glBindBuffer(GL_ARRAY_BUFFER, handle[1]); 
glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0))); 
glEnableVertexAttribArray(1); // Texture coordinates 

glBindVertexArray(0); 



: 쿼드을 준비

: 나는 OpenGL을 4.4

소스를 사용하려고

#version 440 

layout(location = 0) in vec3 vertexPosition; 
layout(location = 1) in vec2 vertexUV; 
layout(location = 2) in vec3 vertexNormal; 

centroid out vec2 UV; 
out vec4 position; 
out vec3 normal; 

uniform mat4 uniMatModel; 
uniform mat4 uniMatView; 
uniform mat4 uniMatProjection; 
uniform mat4 uniMatModelView; 
uniform mat4 uniMatModelViewProjection; 
uniform mat3 uniMatNormal; 




void main() 
{ 
    UV = vertexUV; 
    position = uniMatModelView * vec4(vertexPosition, 1.0); 
    normal = normalize(uniMatNormal * vertexNormal); 
    gl_Position = uniMatModelViewProjection * vec4(vertexPosition, 1.0); 
} 



조각 쉐이더 : 당신이 그것을에 충분한 요소를 가지고 있지 않은 정점 버퍼에서 읽을 때

#version 440 

struct lightInfo { 
    vec4 position; 
    vec3 intensity; 
    bool isActive; 
}; 


// IN 
centroid in vec2 UV; 
in vec4 position; 
in vec3 normal; 


// OUT 
layout (location = 0) out vec4 fragColor; 
layout (location = 1) out vec3 positionData; 
layout (location = 2) out vec3 normalData; 
layout (location = 3) out vec3 colorData; 


// SUBROUTINES 
subroutine void renderPassType(); 
subroutine uniform renderPassType renderPass; 


// UNIFORMS 
uniform sampler2D uniSamTexture; 
uniform sampler2D uniSamAlpha; 
uniform sampler2D uniSamAmbient; 
uniform sampler2D uniSamSpecular; 
uniform sampler2D uniSamShininess; 

uniform lightInfo uniPointLights[32]; 
uniform vec3 uniVec3AmbientEmissiveness; 

layout(binding=0) uniform sampler2D positionTex; 
layout(binding=1) uniform sampler2D normalTex; 
layout(binding=2) uniform sampler2D colorTex; 

subroutine (renderPassType) 
void renderWorld() 
{ 
    if (texture2D(uniSamAlpha, UV).rgb[0] == 1.0) // Alphamaps have to be inverted 
    { 
     discard; 
    } 
    else 
    { 
     colorData = texture2D(uniSamTexture, UV).rgb; 
    } 

    positionData = vec3(position.x, position.y, position.z); 
    normalData = normal; 
    fragColor = vec4(colorData, 1.0); 
} 

subroutine (renderPassType) 
void renderLight() 
{ 
    fragColor = vec4(1.0,0.0,0.0,1.0); // For testing purposes set to red 
} 

void main() 
{ 
    renderPass(); 
} 
+0

오류 메시지에서 중단 단추를 눌렀습니까? 어떤 줄에서 오류가 발생합니까? – BDL

+0

그래, 나는 단 하나의 문제가 아니기 때문에 줄 바꿈과 디버깅을 많이했다. 에러 라인은'// ERROR HERE'로 표시됩니다. 그것은 렌더링 부분에 있어요 :) –

+0

죄송합니다. 나는 단순히 코멘트를 겹쳐 쓴다. :) 가능한 몇 가지 문제에 대해서는 아래의 내 대답을 참조하십시오. – BDL

답변

1

이러한 문제는 NVIDIA 카드에서 발생 시킬수 있습니다. 예를 들어, 단지 6. AMD가 흥미롭게도 그것에 대해 불평하지 않는 버퍼에서 9 vertex 렌더링. 귀하의 경우에는

당신은 위치 2 속성에 정점 버퍼를 결합,하지만 당신은 위치 1.이 활성화 :

glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0))); 
glEnableVertexAttribArray(1); // Texture coordinates 

실제로해야

       || 
           \/ 
glVertexAttribPointer((GLuint)1, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0))); 
glEnableVertexAttribArray(1); // Texture coordinates 

편집 : 난 그냥 다른 일을 보았다

glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW); 

uvs.size()는 애플리케이션에서 6이므로 OpenGL은 6 * 3 = 18 float을 읽습니다. 당신의 uvs 배열은 12 개의 부동 소수점만을 포함합니다 (여기서 vec2를 사용하기 때문에).

+0

그냥 호기심에 대한 : 두 가지 문제 중 어느 것이 예외를 일으켰습니까? – BDL

+0

우 ~, 나는 그 실수를 정말로 보지 못했다! 그래서 문제가 생겼을 때 사람들과 이야기하는 것이 중요합니다 ^^ 마침내 렌더링됩니다. –

+0

첫 번째 추측으로 문제가 해결되었습니다. –