Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0, C++] Failed to find variable "..." in shader

Ostatnio zmodyfikowano 2013-09-09 21:11
Autor Wiadomość
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ć.

C/C++
#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 );
        //lightshader.setParameter("pos", 100.0f, 100.0f);
        //lightshader.setParameter("color", sf::Color(255, 128, 0, 255));
       
        player.setPosition( mousePos.x, mousePos.y );
       
        win.clear();
        win.draw( background, & lightshader );
        //win.draw(player, &lightshader);
        win.display();
    }
}

lightshader.frag
C/C++
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; //*texture2D(texture,gl_TexCoord[0].st);
}

I wywala mi, że radius i texture nie znaleziono w shaderze. Czemu tak się dzieje?
P-91777
DejaVu
» 2013-09-09 20:06:54
http://www.sfml-dev.org​/tutorials/2.0​/graphics-shader.php

Czytał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.
P-91786
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?
P-91800
DejaVu
» 2013-09-09 21:11:20
Jeden temat = jeden problem.
P-91803
« 1 »
  Strona 1 z 1