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ä:

  1. Miksi näin tapahtui? Voisiko se johtua siitä, että näille tietokoneille on asennettu vanhempia ohjaimia?

  2. 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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *