Kehitin pienen moottorin, joka toimi SDL: n ja OpenGL: n yhdistelmällä, ja haluan käyttää sitä moottoria kouluprojektissa, joten minun piti testata sen koulun tietokoneella nähdäksesi suorituskyvyn. Tämä johti varjostimen kääntövirheeseen:
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
Tämä on fragmenttivarjostin, jossa tapahtui virhe:
#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; }
Ratkaisin sen käyttämällä texture2D
-funktio texture
sijaan. Vanhempaa toimintoa ei kuitenkaan suositella uudemmassa koodissa. Tästä minulle jää kaksi kysymystä:
-
Miksi näin tapahtui? Voisiko se johtua siitä, että näille tietokoneille on asennettu vanhempia ohjaimia?
-
Mitä minun pitäisi tehdä, kun haluan noudattaa uusia ohjeita ja tehdä siitä myös ajettavissa vanhemmissa koneissa ? Ajattelin käyttää kahta erilaista varjostinta ja antaa ohjelman päättää versiosta, mutta en ole varma.
vastaus
Voit käyttää makroa:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Löysin tämän vastauksen , jolla näyttää olevan yhteensopivuusominaisuus, joka käsittelee muutakin kuin vain texture2d
.
Vastaa
Koti-PC: lläsi on todennäköisesti korkeampi varjostinversio kuin koulun PC: llä, koska GPU on vanhempi. Vanhemmat glsl-versiot käyttivät texture2d
-funktiota, kun taas uudemmat käyttävät yksinkertaisesti texture
.
Sinun ei tarvitse sinulla on 2 erilaista varjostuskoodia, voit tehdä siitä dynaamisen esiprosessoreilla:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Kun koodi käännetään, opengl päättää käytettävän version.