{{notification.text}}

MirGames

13.03.15 09:09
0

Привет! Помогите разобраться в шейдере, никак не пойму что за позиция в World Space.

vec3 R = reflect(p, normal); // p - позиция в world space [-1;1]
float L = 0.1;
vec4 T = vec4(0.0);
vec3 NewPos;
for (int i = 0; i < 10; i++)
{
  NewPos = p + R * L;
  T = proj * vec4(NewPos, 1.0); // proj - матрица прекции
  T.xy = vec2(0.5) + 0.5 * T.xy / T.w;
  NewPos = texture(positionMap, T.xy).xyz;
  L = length(p - NewPos);
}

color = texture(colorMap, T.xy).rgb;

Пробовал делать так, но сказали что это вектор взгляда а не позиция в W.S.

vec3 GetWorldSpacePos(in float depth)
{
    vec3 screencoord = vec3(((gl_FragCoord.x/buffersize.x)-0.5) * 2.0 * (buffersize.x/buffersize.y),((-gl_FragCoord.y/buffersize.y)+0.5) * 2.0,depth);
    screencoord.x *= screencoord.z / camerazoom;
    screencoord.y *= -screencoord.z / camerazoom;
    vec3 position = (camerainversematrix* vec4(screencoord,1.0)).xyz;
    return position;
}

Вершинный шейдер:
#version 400

uniform mat4 projectionmatrix;
uniform mat4 drawmatrix;
uniform vec2 offset;
uniform vec2 position[4];

in vec3 vertex_position;

void main(void)
{
    gl_Position = projectionmatrix * (drawmatrix * vec4(position[gl_VertexID]+offset, 0.0, 1.0));
}
Отредактировано: 13.03.15 09:20
#1
13.03.15 09:25
0

Попробовал так, но что то не уверен.

//Для пост-эффекта изначально экран вверх ногами, отражаем его.
vec2 tcoord = vec2(gl_FragCoord.xy/buffersize);
if (isbackbuffer) tcoord.y = 1.0 - tcoord.y;
vec4 p = inverse(projectionmatrix) * vec4 (tcoord.x,  tcoord.y, -1, 1);
Отредактировано: 13.03.15 09:25
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}