Dezvoltam un motor mic care funcționa pe o combinație de SDL și OpenGL și vreau să folosesc acel motor pentru un proiect școlar, așa că am avut nevoie să testez pe un computer școlar pentru a vedea spectacolul. Aceasta a dus la o eroare de compilare a shader-ului:

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

Acesta este fragmentul meu, unde s-a produs eroarea:

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

Am rezolvat-o folosind texture2D, în loc de texture. Cu toate acestea, funcția mai veche nu este recomandată în codul mai nou. Acest lucru mă lasă cu două întrebări:

  1. De ce s-a întâmplat acest lucru? Ar fi putut fi din cauza instalării de drivere mai vechi pe aceste PC-uri?

  2. Ce ar trebui să fac când vreau să urmez noile linii directoare și, de asemenea, să îl fac rulabil pe mașini mai vechi ? M-am gândit să folosesc două shader-uri diferite și să las programul să decidă versiunea, dar nu sunt sigur.

Răspuns

Puteți utiliza o macro:

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

Am găsit acest răspuns , care pare să aibă o compatibilitate care să gestioneze mai mult decât doar texture2d.

Răspuns

PC-ul dvs. de acasă are probabil o versiune mai înaltă decât cea a școlii, deoarece GPU este mai în vârstă. Versiunile mai vechi glsl foloseau funcția texture2d, în timp ce cele mai noi folosesc pur și simplu texture.

Nu este necesar să au 2 coduri diferite de shader, îl puteți face dinamic cu preprocesoarele:

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

Când codul este compilat, opengl va decide ce versiune să utilizați.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *