2017-01-07 6 views
-1

게임을 복제하고 싶습니다. 게임의 목표는 같은 색을 가진 2 개의 사각형 사이에 경로를 만드는 것입니다. 여기 opengl glsl glsl을 사용하면 모델이 보이지 않는 버그 다른 매개 변수를 사용하여 텍스처 함수

는 게임이다 :

www.mypuzzle.org/3d-logic-2 큐브 6 개면을 가지고있다. 각 얼굴은 3x3 사각형을가집니다.

빈 사각형 (환경 반영), 벽 사각형 (색상 지정 불가능), 시작/끝 사각형 (중간에 검은 색 사각형이 있지만 나머지는 색이 지정됨) .

내 프로젝트를 마무리하는 데 거의 다쳤지만 버그가 있습니다. 나는 C++, sfml, opengl, glm을 사용했다.

문제는 쉐이더에 있습니다.

정점 셰이더 :

#version 330 core 

layout (location = 0) in vec3 vPosition; 
layout (location = 1) in vec3 vColor; 
layout (location = 2) in vec2 vTexCoord; 
layout (location = 3) in float vType; 
layout (location = 4) in vec3 vNormal; 

out vec3 Position; 
out vec3 Color; 
out vec2 TexCoord; 
out float Type; 
out vec3 Normal; 

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 

void main() 
{ 
    gl_Position = projection * view * model * vec4(vPosition, 1.0f); 

    Position = vec3(model * vec4(vPosition, 1.0f)); 
    Color=vColor; 
    TexCoord=vTexCoord; 
    Type=vType; 
    Normal = mat3(transpose(inverse(model))) * vNormal; 
} 

단편 쉐이더 : 나 특정 형식을 가지는 사각형의 픽셀을 그리는 프래그먼트 쉐이더

#version 330 core 
in vec3 Color; 
in vec3 Normal; 
in vec3 Position; 

in vec2 TexCoord; 
in float Type; 

out vec4 color; 

uniform samplerCube skyboxTexture; 
uniform sampler2D faceTexture; 
uniform sampler2D centerTexture; 

void main() 
{ 
    color=vec4(0.0,0.0,0.0,1.0); 
    if(Type==0.0) 
    { 
     vec3 I = normalize(Position); 
     vec3 R = reflect(I, normalize(Normal)); 
     if(texture(faceTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0)) 
      color=mix(texture(skyboxTexture, R),vec4(1.0,1.0,1.0,1.0),0.3);*/ 
    } 
    else if(Type==1.0) 
    { 
     if(texture(centerTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0)) 
      color=vec4(Color,1.0); 
    } 
    else if(Type==-1.0) 
    { 
     color=vec4(0.0,0.0,0.0,1.0); 
    } 
    else if(Type==2.0) 
    { 
     if(texture(faceTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0)) 
      color=mix(vec4(Color,1.0),vec4(1.0,1.0,1.0,1.0),0.5); 
    } 
} 

/* 
Type== 0 ---> blank square(reflects light) 
Type== 1 ---> start/finish square 
Type==-1 ---> wall square 
Type== 2 ---> colored square that was once a black square 
*/ 

셰이더 만 1로 입사하므로 각 사각형에 대해 4면. 이 프로그램은 glsl 함수 texture을 같은 텍스처로만 사용하면 잘 작동합니다. 이 함수를 다른 텍스처로 두 번 사용하면 2 가지 경우에 내 모델이 보이지 않게됩니다. 왜 그런 일이 일어나는거야?

https://postimg.org/image/lximpl0bz/

https://postimg.org/image/5dzvqz2r7/

붉은 광장

내 모델이 보이지 않는 가서 다음 경우 내가 유형 == 0 코드를 수정 한 유형 1이다.

답변

1

OpenGL의 텍스처 샘플러는 (적어도) 동적으로 균일 한 제어 흐름에서만 액세스해야합니다. 이것은 기본적으로 셰이더의 모든 호출이 동일한 코드 경로를 실행한다는 것을 의미합니다. 그렇지 않은 경우 자동 그라디언트를 사용할 수 없으며 밉 매핑 또는 이방성 필터링이 실패합니다.

프로그램에서이 문제는 여러 텍스처를 사용하려고 할 때 정확하게 발생합니다. 한 가지 해결책은 그라디언트를 필요로하는 것을 사용하지 않는 것일 수 있습니다. 또한 텍스처 아틀라스에서 모든 텍스처를 패치하고 셰이더에서 적절한 uv 좌표를 선택하거나 각 쿼드를 개별적으로 드로잉하고 균일 한 변수를 통해 유형을 제공하는 등의 여러 가지 옵션이 있습니다.