2017-01-07 15 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 ifs для каждого квадрата. Программа отлично работает, если я использую только функцию glsl texture с той же текстурой. Если я использую эту функцию 2 раза с разными текстурами, то в 2-х разных случаях, если моя модель становится невидимой. Почему это происходит?

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

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

красный квадрат типа 1. Я модифицированный код типа == 0, если и тогда моя модель пошла невидимы.

ответ

1

Пробоотборник текстуры в OpenGL должен быть доступен только в (по крайней мере) динамически однородном потоке управления. Это в основном означает, что все вызовы шейдера выполняют один и тот же путь кода. Если это не так, то автоматические градиенты недоступны, а mipmapping или анизотропная фильтрация не удастся.

В вашей программе эта проблема возникает, когда вы пытаетесь использовать несколько текстур. Одним из решений может быть не использование ничего, что требует градиентов. Есть также ряд других вариантов, например, исправление всех текстур вместе в атласе текстуры и просто выбор соответствующих uv-координат в шейдере или рисование каждого квадрата отдельно и предоставление типа через однородную переменную.

 Смежные вопросы

  • Нет связанных вопросов^_^