2013-07-14 3 views
0

오류가 발생하지 않은 데스크톱 컴퓨터에서 C++로 OpenGL 게임을 개발했습니다. 이제는 타블렛에서 컴파일하고 실행하면 조명이 엉망이됩니다. 이것은 내 조명 버퍼입니다.다른 장치에서만 조명 문제가 발생했습니다

the lighting calculation is incorrect

나는 지연 렌더링을 사용, 그래서 나는 질감 등의 위치와 법선을 가지고있다. 아래 답변에서 지적했듯이 조명 문제의 이유는 일반적인 텍스처 대신 위치 텍스처가 계산에 사용된다는 것입니다.

환경에 대한 몇 가지 사실. 두 시스템 모두 Windows 8 Pro 64bit를 실행합니다. 비디오 카드는 데스크탑의 Nvidia Geforce 560과 태블릿의 Intel HD Graphics 4000입니다. 이 경우 G 버퍼 텍스처, 법선 및 위치는 태블릿에서 그대로 유지되며 혼합되지 않습니다. OpenGL 오류가 없습니다.

내 조명 쉐이더입니다.

#version 330 

in vec2 coord; 
out vec3 image; 

uniform int type = 1; 

uniform sampler2D positions; 
uniform sampler2D normals; 
uniform vec3 light; 
uniform vec3 color; 
uniform float radius; 
uniform float intensity = 1.0; 

void main() 
{ 
    if(type == 0) // directional light 
    { 
     vec3 normal = texture2D(normals, coord).xyz; 
     float fraction = max(dot(normalize(light), normal)/2.0 + 0.5, 0); 
     image = intensity * color * fraction; 
    } 
    else if(type == 1) // point light 
    { 
     // ... 
    } 
    else if(type == 2) // spot light 
    { 
     // ... 
    } 
} 

이것은 샘플러 유니폼을 바인딩하는 데 사용하는 코드입니다. Pass->Samplers은 텍스처 타겟 ID를 셰이더 위치에 매핑하는 unordered_map<string, GLuint>입니다. Pass->Program에는 셰이더 프로그램 ID가 저장됩니다.

glUseProgram(Pass->Program); 

int n = 0; for(auto i : Pass->Samplers) 
{ 
    glActiveTexture(GL_TEXTURE0 + n); 
    glBindTexture(GL_TEXTURE_2D, i.second); 
    glUniform1i(glGetUniformLocation(Pass->Program, i.first.c_str()), n); 
    n++; 
} 

태블릿 기계에서 위치 및 법선 샘플러가 왜 섞여 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

업데이트 : 내 운영 체제를 Windows 8.1로 업데이트 한 후 문제가 사라진 것으로 나타났습니다.

답변

1

정상적인 조명 대신 위치 데이터를 사용하는 것처럼 보입니다. 텍스처가 섞여있을 수도 있습니다 (샘플러 유니폼은 태블릿에서 데스크탑 사이의 다른 위치에있을 수 있습니다).

+0

와우, 그건 의미가 있습니다. 어떻게 확인할 수 있습니까? 두 컴퓨터에서 정확히 동일한 소스 코드를 사용합니다. 그러나 의도하지 않게 의도하지 않게 실수로 내 데스크톱에서 올바로 작동하는 정의되지 않은 동작을 사용합니다 ... – danijar

+0

"GLint norm = glGetUniformLocation (prog_id,"normals ");'("위치 "). 그것은 당신에게 획일 한 위치를 얻을 것이다. 그런 다음 각각의 텍스처 (텍스처 id가 아님)에 대해 사용중인 텍스처 _unit_을 각각 설정해야합니다. – GuyRT

+0

나는 그 수표를했다. 데스크톱에서 위치는 '법선'의 경우 '3'이고 위치의 경우 '4'입니다. 태블릿의 위치는'1183'과'1186'입니다. 실제로 '0'과 '1'이되어서는 안됩니까? 내 질문에 바인딩 코드를 추가했습니다. – danijar

관련 문제