Pracowałem nad małym silnikiem działającym na kombinacji SDL i OpenGL i chcę użyć tego silnika w szkolnym projekcie, więc musiałem przetestować na szkolnym komputerze, aby zobaczyć występ. Spowodowało to błąd kompilacji modułu cieniującego:

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

To jest mój Fragment Shader, w którym wystąpił błąd:

 #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; } 

Rozwiązałem to za pomocą texture2D zamiast texture. Jednak starsza funkcja nie jest zalecana w nowszym kodzie. Pozostają mi dwa pytania:

  1. Dlaczego tak się stało? Czy mogło to być spowodowane instalacją starszych sterowników na tych komputerach?

  2. Co powinienem zrobić, jeśli chcę postępować zgodnie z nowymi wytycznymi, a także, aby działało na starszych komputerach ? Myślałem o użyciu dwóch różnych shaderów i pozwoleniu programowi decydować o wersji, ale nie jestem pewien.

Odpowiedź

Możesz użyć makra:

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

Udało mi się znaleźć tę odpowiedź , która wydaje się mieć element zgodności, który obsługuje więcej niż tylko texture2d.

Odpowiedź

Twój domowy komputer prawdopodobnie ma wyższą wersję shadera niż komputer szkolny, ponieważ GPU jest starszy. Starsze wersje glsl korzystały z funkcji texture2d, podczas gdy nowsze wersje używają po prostu texture.

Nie musisz mają 2 różne kody shaderów, możesz uczynić go dynamicznym za pomocą preprocesorów:

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

Kiedy kod zostanie skompilowany, opengl zdecyduje, której wersji użyć.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *