Jeg utviklet en liten motor som kjørte på en kombinasjon av SDL og OpenGL, og jeg vil bruke den motoren til et skoleprosjekt, så jeg trengte å teste den på en skole-PC for å se forestillingen. Dette resulterte i en kompileringsfeil for skyggen:

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

Dette er min fragmentskygge, der feilen oppstod:

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

Jeg løste det ved å bruke texture2D -funksjon, i stedet for texture. Den eldre funksjonen anbefales imidlertid ikke i nyere kode. Dette etterlater meg med to spørsmål:

  1. Hvorfor skjedde dette? Kan det ha vært på grunn av at eldre drivere ble installert på disse PCene?

  2. Hva skal jeg gjøre når jeg vil følge de nye retningslinjene, og også for å gjøre det kjørt på eldre maskiner? ? Jeg tenkte å bruke to forskjellige skyggelegger, og la programmet bestemme hvilken versjon, men jeg er ikke sikker.

Svar

Du kan bruke en makro:

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

Jeg fant dette svaret , som ser ut til å ha en kompatibilitets inkluderer som håndterer mer enn bare texture2d.

Svar

Hjemme-PC-en din har sannsynligvis en høyere skyggeversjon enn skole-PC-en, fordi GPU er eldre. Eldre glsl-versjoner brukte texture2d -funksjonen, mens nyere bare bruker texture.

Du trenger ikke å har to forskjellige skyggekoder, du kan gjøre den dynamisk med forprosessorer:

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

Når koden blir samlet, bestemmer opengl hvilken versjon du vil bruke.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *