Eu estava desenvolvendo um pequeno mecanismo rodando em uma combinação de SDL e OpenGL e quero usar esse mecanismo para um projeto escolar, então precisei testar em um PC escolar para ver o desempenho. Isso resultou em um erro de compilação do sombreador:

Shader compile ERROR
DEBUG INFO: ERROR: 0:12: "texture" : no matching overloaded function found (using implicit conversion)
ERROR 0:12: "=" : cannot convert from "const float" to "4-component vector of float"

Failed to load uniform

Este é meu shader de fragmento, onde ocorreu o erro:

 #version 130 in vec4 fragmentColor; in vec2 fragmentUV; out vec4 color; uniform float time; uniform sampler2D mySampler; void main(){ vec4 textureColor = texture(mySampler, fragmentUV); color = textureColor * fragmentColor; } 

Eu resolvi usando o texture2D função, em vez de texture. No entanto, a função mais antiga não é recomendada em códigos mais novos. Isso me deixa com duas perguntas:

  1. Por que isso aconteceu? Será que isso aconteceu por causa da instalação de drivers mais antigos nesses PCs?

  2. O que devo fazer quando quiser seguir as novas diretrizes e também torná-los executáveis em máquinas mais antigas ? Pensei em usar dois shaders diferentes e deixar o programa decidir a versão, mas não tenho certeza.

Resposta

Você pode usar uma macro:

#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV); 

Eu encontrei esta resposta , que parece ter uma inclusão de compatibilidade que lida com mais do que apenas texture2d.

Resposta

Seu PC doméstico provavelmente tem uma versão de shader superior ao PC escolar, porque a GPU é mais velho. Versões mais antigas do glsl usavam a função texture2d, enquanto as mais recentes simplesmente usam texture.

Você não precisa tem 2 códigos de sombreador diferentes, você pode torná-lo dinâmico com pré-processadores:

#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif 

Quando o código for compilado, o opengl decidirá qual versão usar.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *