.[ ČeskéHry.cz ].
Problém s gl_PointSize v GLSL

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 27. březen 2014, 19:31:49    Předmět: Problém s gl_PointSize v GLSL Odpovědět s citátem

Zatím mám částíce řešené přes point sprites. No ještě předtím než jsem přecházel na shadery tak point sprites bylo v pohodě, ale jak už mám to přes shader, tak mám problém s velikosti částic, kdy gl_PointSize má rozdílnou velikost v závislosti na pozici kamery. Tedy čím blíž jsem k částícím tím jsou menší a čím dál jsem od nich tak jsou větší. No a já bych to potřeboval naopak. Tady na tomto foru to taky řešily a nevyřešilo.
https://www.opengl.org/discussion_boards/showthread.php/161896-Point-sprite-with-GLSL
Tady je pěkný příklad co to dělá i mně.
screenshot:
far - http://olz.photo.qq.com/?file=BCCC46...30BB417A758791
near - http://ol7.photo.qq.com/?file=8F8892...298358BE019010
kód:
vertex
#version 330
layout (location = 0) in vec3 Position;                                             

uniform mat4 mProjection, mView, mModel;
uniform float size;
uniform vec3 camPosition;
void main(void)
{      
    vec4 pos = mProjection * mView * mModel * vec4(Position, 1.0); 
    gl_Position = pos;
   float dist = dot(pos.xyz, camPosition);
 //  gl_PointSize = size;
  gl_PointSize = size - (dist * 0.0038);  // dočasné řešení dobré jen pro velké částíce v menší oblasti, ale nepoužitelné pro menší částice
}

fragment
#version 330
out vec4 FragColor;
uniform sampler2D sprite_texture;
uniform vec4 vColor;
void main(void)
{
    FragColor = texture(sprite_texture, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y)) * vColor;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 27. březen 2014, 19:44:43    Předmět: Odpovědět s citátem

Z mnoha důvodů je lepší použít otexturované quady. I když to není asi odpověď, kterou jsi chtěl. Takže se omlouvám Wink
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 29. březen 2014, 10:59:56    Předmět: Odpovědět s citátem

najprv nastavit uniform heightOfNearPlane.
kód:
float fovy = 60; // degrees
int viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
float heightOfNearPlane = (float)abs(viewport[3]-viewport[1]) /
    (2*tan(0.5*fovy*PI/180.0));

a potom v shadery.
kód:
gl_PointSize = (heightOfNearPlane * pointSize) / gl_Position.w;


ale lepsie je spravit to cez geometry shader. totit point sprites maju nepeknu vlastnost ze ich viditelnost sa rata pre stred castice. teda ak zajde za okraj obrazovky pol castice tak zmiznu. nVidia to ale ignoruje a zobrazuje vzdy.

kód:
//vertex
#version 150 core
    uniform mat4 MV;//modelview matrix
    in vec4 vertex;
    out vec4 eyePos;

    void main()
    {
        eyePos = MV*vertex;
    }

//geometry
#version 150 core
const vec2 corners[4] = vec2[4](vec2(0.0, 1.0), vec2(0.0, 0.0), vec2(1.0, 1.0), vec2(1.0, 0.0) );

    uniform mat4 P;//projection matrix

    layout(points) in;
    layout(triangle_strip, max_vertices = 4) out;
    in vec4 eyePos[];
    out vec2 texCoord;

    void main()
    {
        for(int i=0;i<4;i++)
        {
            vec4 pos = eyePos[0];
            pos.xy += (corners[i] - vec2(0.5))*0.1;
            gl_Position = P*pos;
            texCoord = corners[i];
            EmitVertex();
        }
    }

EDIT: zadunuty core v vertex shadery
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.


Naposledy upravil nou dne 29. březen 2014, 19:03:01, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 29. březen 2014, 16:16:50    Předmět: Odpovědět s citátem

Díky to je skvělé řešení funguje. Zatím jsem použil tu jednodušší možnost. Pak možná zkusím i tu s geometry shaderem. No zrovna když vidím, že tam máš u verze daný "core" profil. Ten definuje co přesně jaksi jsem to moc nepochopil nebo to jen zamezuje v použití starších tedy deprecated funkcí?
Jinak quady jsem také zkoušel, ale není to zrovna lehké vytvořit s tím částicový systém, protože jak u jednoho nebo druhého tutoriálu jsem měl taky nějaký problém, proto radši jsem dával přednost point sprites.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 29. březen 2014, 19:02:10    Předmět: Odpovědět s citátem

ano core je zakazanie pouzivania deprectated funckii. totiz Mesa/MacOS ani nic ine nepodporuju. teda ak dnes vyvijat pre OGL3+ tak jedine core. a som zabudol dat core aj do vertex shadera.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna