我正在开发OpenGL应用程序,并且在实现cubemap反射着色器时遇到了问题:反射与相机围绕着物体旋转,从任何角度来看都是一样的。
这是我的顶点着色器:
in vec4 in_Position;
in vec4 in_Normal;
out vec3 ws_coords;
out vec3 normal;
mat4 uniform_ModelViewProjectionMatrix;
mat4 uniform_ModelViewMatrix;
mat4 uniform_ModelMatrix;
mat3 uniform_NormalMatrix;
vec3 uniform_CameraPosition;
...
ws_coords = (uniform_ModelViewMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
和碎片:
uniform samplerCube uniform_ReflectionTexture;
...
vec3 normal = normalize(normal);
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);
frag_Color = texture(uniform_ReflectionTexture, reflectedDirection).xyz
我在互联网上找到的所有着色器都有相同的问题,或者给我带来了奇怪的结果。
我想我需要用相机旋转来旋转反射方向,但是我不知道怎么做。在着色输入,我有世界空间相机的位置,MVP,MV,M和正常矩阵。
请你帮我实现着色器,考虑到相机的方向。
发布于 2015-04-23 06:00:17
这部分在我看来有点奇怪:
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);
第一个要反映的参数必须是从像素位置到相机位置的矢量,在世界空间中。
我建议你有一个相机的世界位置,然后把你的in_Position带到世界空间(我不知道他们目前在哪个空间),并由此创建一个归一化向量。然后用一个世界空间法向量来反映它,然后对你的立方体地图进行采样。
发布于 2015-04-26 22:23:35
好吧,我找到答案了,
我的问题是我用ViewSpace做了计算,这就是为什么反射是静态的。我的NormalMatrix也在ViewSpace。
所以修正是
ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
并将法线矩阵从视图空间转换为模型空间。
https://stackoverflow.com/questions/29816187
复制相似问题