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

[SFML 2.X] Przypisanie przezroczystego prostokąta teksturze

Ostatnio zmodyfikowano 2024-11-09 20:31
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] Przypisanie przezroczystego prostokąta teksturze
» 2024-11-08 17:34:12
Witam.
Jak usunąć fragment tekstury sf::RenderTexture? To znaczy mam przeźroczysty prostokąt, który chciałbym umieścić na teksturze i żeby przypisało te przeźroczyste piksele?
P-181853
DejaVu
» 2024-11-09 09:55:02
Jeżeli chcesz mieć teksturę z 'dziurą' w środku, to musisz przygotować sobie sf::Image z 'dziurą' w środku (z pikselami przezroczystymi), a następnie załadować teksturę do sf::Texture. Innymi słowy: jeżeli chcesz zmieniać wygląd tekstury to powinieneś 'zmodyfikować' wygląd w sf::Image (która znajduje się w pamięci RAM), a następnie go załadować do sf::Texture. Jak masz już załadowaną teksturę do sf::Texture (czyli w praktyce do pamięci karty graficznej), to później pozostają Ci tylko shadery do modyfikowania wyglądu.

Musisz sobie uświadomić, że:
- sf::Image - obrazek trzymany jest w pamięci RAM, więc można go łatwo modyfikować i obrabiać, bo do pamięci RAM masz dostęp przez CPU
- sf::Texture - obrazek jest trzymany w pamięci karty graficznej, a dostęp do niego masz przez procesor karty graficznej (GPU)

sf::Texture służy poniekąd do transferu danych z RAM do GPU-RAM i na odwrót.
P-181855
pekfos
» 2024-11-09 12:57:57
Możesz albo wyczyścić teksturę na start używając clear() i rysować tylko to co ma być nieprzezroczyste, albo rysować geometrię wypełnioną kolorem przezroczystym używając BlendMode które ignoruje alfę.
https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1RenderTarget.php#a6bb6f0ba348f2b1e2f46114aeaf60f26
https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1RenderStates.php#ad6ac87f1b5006dae7ebfee4b5d40f5a8
P-181856
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-09 13:06:18
Ok. Dzięki! :-)
P-181857
pekfos
» 2024-11-09 13:10:23
Pierwsza opcja jest trywialna, to dla demonstracji druga:
C/C++
#include <SFML/Graphics.hpp>

int main()
{
   
sf::RenderWindow okno( sf::VideoMode( 200, 200 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
   
   
sf::RenderTexture rt;
   
rt.create( 200, 200 );
   
rt.clear( sf::Color::Transparent );
   
   
// Prerenderowanie pierścienia
   
{
       
sf::CircleShape cs( 80 );
       
cs.setOrigin( cs.getRadius() * sf::Vector2f( 1, 1 ) );
       
cs.setFillColor( sf::Color::Red );
       
cs.setPosition( 100, 100 );
       
rt.draw( cs );
       
       
cs.setRadius( 50 );
       
cs.setOrigin( cs.getRadius() * sf::Vector2f( 1, 1 ) );
       
cs.setFillColor( sf::Color::Transparent );
       
//rt.draw(cs); // Nic nie robi, bo rysujemy przezroczyste koło.
       
       
sf::RenderStates rs;
       
rs.blendMode = sf::BlendNone;
       
rt.draw( cs, rs ); // Faktyczne rysowanie pustego obszaru
       
       
rt.display();
   
}
   
   
while( okno.isOpen() )
   
{
       
sf::Event event;
       
while( okno.pollEvent( event ) )
       
{
           
if( event.type == sf::Event::Closed )
               
 okno.close();
           
       
}
       
       
okno.clear( sf::Color::Cyan );
       
       
sf::Sprite spr;
       
spr.setTexture( rt.getTexture() );
       
okno.draw( spr );
       
       
okno.display();
   
}
}
P-181858
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-09 19:35:55
Spróbowałem tak zrobić i nie działa :-/
A jak dopiszę rtex.display() to psuje mi teksture i .. i tak nie rysuje transparentego prostokąta

C/C++
// RENDER EMPTY PLACE FOR THE DOOR
if( _door != nullptr ) {
   
sf::RectangleShape door( sf::Vector2f( _door->sprite.getTexture()->getSize() ) );
   
door.setFillColor( sf::Color::Transparent );
   
door.setPosition( float( size.x ) / 2.0f * 16.0f - door.getSize().x / 2.0f + tile_width / 2.0f, 0.0f );
   
rtex.draw( door, sf::RenderStates( sf::BlendNone ) );
}
P-181864
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-09 19:46:08
P-181865
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-09 20:31:53
Dobra już mam. Oto kod:
C/C++
// RENDER EMPTY PLACE FOR THE DOOR
if( _door != nullptr ) {
   
sf::RectangleShape door( sf::Vector2f( _door->sprite.getTexture()->getSize() ) );
   
   
for( short y = 0; y < door.getSize().y - 1; y++ )
       
 for( short x = 0; x < door.getSize().x; x++ ) {
       
sf::Vector2i pos;
       
pos.x = float( size.x ) / 2.0f * 16.0f - door.getSize().x / 2.0f + tile_width / 2.0f + x;
       
pos.y = rtex.getSize().y - 1 - y;
       
house_image.setPixel( pos.x, pos.y, sf::Color( 0, 0, 0, 0 ) );
   
}
}
P-181866
« 1 »
  Strona 1 z 1