Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 27. březen 2014, 19:31:49 Předmět: Problém s gl_PointSize v GLSL |
|
|
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 27. březen 2014, 19:44:43 Předmět: |
|
|
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 _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 29. březen 2014, 10:59:56 Předmět: |
|
|
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 |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 29. březen 2014, 16:16:50 Předmět: |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 29. březen 2014, 19:02:10 Předmět: |
|
|
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 |
|
|
|