[SFML 2.0, C++] Failed to find variable "..." in shader
Ostatnio zmodyfikowano 2013-09-09 21:11
polkom21 Temat założony przez niniejszego użytkownika |
[SFML 2.0, C++] Failed to find variable "..." in shader » 2013-09-09 18:39:28 Cześć. Otóż zabieram się za grę ale najpierw chcę rozeznać się jak to będzie z światłami. Gdzieś wyczytałem, że można to zrobić za pomocą shadera i mam taki problem, że coś nie chce mi działać. #include <SFML/Graphics.hpp> #include <assert.h>
int main() { sf::VideoMode vidmode; vidmode.width = 800; vidmode.height = 600; vidmode.bitsPerPixel = 32; assert( vidmode.isValid() ); sf::RenderWindow win( vidmode, "Light test" ); sf::Event event; sf::Texture backgroundImage, light, playerTexture; assert( backgroundImage.loadFromFile( "data/background.png" ) ); assert( light.loadFromFile( "data/lightFin.png" ) ); assert( playerTexture.loadFromFile( "data/player.png" ) ); backgroundImage.setRepeated( true ); sf::Sprite background( backgroundImage ); background.setTextureRect( sf::IntRect( 0, 0, vidmode.width, vidmode.height ) ); sf::Sprite player( playerTexture ); sf::Shader lightshader; lightshader.loadFromFile( "data/lightshader.frag", sf::Shader::Type::Fragment ); while( win.isOpen() ) { while( win.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) win.close(); } sf::Vector2i mousePos = sf::Mouse::getPosition( win ); lightshader.setParameter( "lightpos", mousePos.x, mousePos.y ); lightshader.setParameter( "lightColor", sf::Color::Yellow ); lightshader.setParameter( "screenHeight", vidmode.height ); lightshader.setParameter( "lightAttenuation", 1.0f, 1.0f, 1.0f ); lightshader.setParameter( "radius", 1.0f ); lightshader.setParameter( "texture", light ); player.setPosition( mousePos.x, mousePos.y ); win.clear(); win.draw( background, & lightshader ); win.display(); } }
lightshader.frag uniform vec2 lightpos; uniform vec3 lightColor; uniform float screenHeight; uniform vec3 lightAttenuation; uniform float radius;
uniform sampler2D texture;
void main() { vec2 pixel = gl_FragCoord.xy; pixel.y = screenHeight - pixel.y; vec2 aux = lightpos - pixel; float distance = length( aux ); float attenuation = 1.0 /( lightAttenuation.x + lightAttenuation.y * distance + lightAttenuation.z * distance * distance ); vec4 color = vec4( attenuation, attenuation, attenuation, 1.0 ) * vec4( lightColor, 1.0 ); gl_FragColor = color; }
I wywala mi, że radius i texture nie znaleziono w shaderze. Czemu tak się dzieje? |
|
DejaVu |
» 2013-09-09 20:06:54 http://www.sfml-dev.org/tutorials/2.0/graphics-shader.phpCzytałeś cały powyższy artykuł? The GLSL compiler optimizes out unused variables (here, "unused" means "not involved in the calculation of the final vertex/pixel"). So don't be surprised if you get error messages such as Failed to find variable "xxx" in shader when you call setParameter during your tests.
|
/edit: Innymi słowy: albo zmienne muszą zostać użyte, albo nie mogą być one przekazane do shadera. |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-09-09 21:07:00 Dobra są komentarze w shaderze więc nie są używane i dla tego wywala ten błąd. Pozbyłem się jednego a teraz za to mam nastepny, który brzmi "An internal OpenGL call failed in Shader.cpp (296) : GL_INVALID_OPERATION, the specified operation is not allowed in the current state". A to czemu znów? |
|
DejaVu |
» 2013-09-09 21:11:20 Jeden temat = jeden problem. |
|
« 1 » |