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

[GLSL + SFML] Ucinanie fragmentów sprite'a po wykorzystaniu Shadera

Ostatnio zmodyfikowano 2016-05-19 16:27
Autor Wiadomość
Virpi
Temat założony przez niniejszego użytkownika
[GLSL + SFML] Ucinanie fragmentów sprite'a po wykorzystaniu Shadera
» 2016-05-17 15:51:05
Cześć. Ostatnio staram się wykorzystać shadery w swoich grach (jako urozmaicenie, bez shaderów wszystko działa). Napotkałem jednak na pewien kłopot. Mam klasę CBall, która reprezentuje piłkę do kosza. Piłka wyświetlana jest jako sprite 50x50. Jest to tekstura png, na której jest czerwone koło o średnicy 50pix. Teraz za pomocą shadera chciałbym, aby wokół piłki pojawiła się biała obwódka. Moje shadery wyglądają tak:
C/C++
const std::string vert =
"void main()\
         {\
             gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\
             gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;\
         }";
const std::string frag =
"uniform sampler2D tex0;\
 \
         void main()\
         {\
             vec4 circle_color = vec4(1.0, 1.0, 1.0, 1.0);\
             float circle_radius = 0.5;\
             vec2 circle_center = vec2(0.5,0.5);\
             vec2 uv = gl_TexCoord[0].xy;\
             vec4 bkg_color = texture2D(tex0,uv);\
             uv -= circle_center;\
             float dist =  sqrt(dot(uv, uv));\
             if ( (dist > (circle_radius+0.05)) || (dist < (circle_radius-0.05)) )\
               gl_FragColor = bkg_color;\
             else \
               gl_FragColor = circle_color;\
         }";

CBall dziedziczy po sf::Drawable. Nadpisana metoda wygląda tak:
C/C++
void CBall::draw( sf::RenderTarget & target, sf::RenderStates states ) const
{
    states.shader = & FShader; // FShader to atrybut tej klasy;
   
    target.draw( FSprite, states );
}

Niby wszystko w porządku, ale obwódka ta sprawia, że sprite ma większe wymiary niż 50x50 i przez to przy rysowaniu ucinane są jego "wystające" fragmenty. Jak powinienem zrobić to poprawnie?
P-148335
RazzorFlame
» 2016-05-18 14:43:06
Polecam bez shaderów. sf::CircleShape i nałożyć teksturę.
Shapes (SFML / Learn)
Prosz
P-148372
Virpi
Temat założony przez niniejszego użytkownika
» 2016-05-19 16:27:59
Dzięki ;) ale to już doskonale umiem. Dałem tylko takie prosty przykład, żeby dowiedzieć się, jak zrobić to za pomocą Shaderów. Docelowo chciałbym wykorzystywać je do trudniejszych rzeczy, np pozostawiania smug po ruchu, cieni itp. Chciałbym tylko dowiedzieć się na takim przykładzie, jak poprawnie narysować obiekt, który po użyciu Shadera zwiększa swoje wymiary i przez to nie jest rysowany w całości, bo wykracza poza rozmiar wcześniejszego sprite'a.
P-148407
« 1 »
  Strona 1 z 1