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:
-
Dlaczego tak się stało? Czy mogło to być spowodowane instalacją starszych sterowników na tych komputerach?
-
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ć.