首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GLSL cubemap反射着色器

GLSL cubemap反射着色器
EN

Stack Overflow用户
提问于 2015-04-23 07:11:26
回答 2查看 2.6K关注 0票数 0

我正在开发OpenGL应用程序,并且在实现cubemap反射着色器时遇到了问题:反射与相机围绕着物体旋转,从任何角度来看都是一样的。

这是我的顶点着色器:

代码语言:javascript
代码运行次数:0
运行
复制
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);

和碎片:

代码语言:javascript
代码运行次数:0
运行
复制
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和正常矩阵。

请你帮我实现着色器,考虑到相机的方向。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 14:00:17

这部分在我看来有点奇怪:

代码语言:javascript
代码运行次数:0
运行
复制
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);

第一个要反映的参数必须是从像素位置到相机位置的矢量,在世界空间中。

我建议你有一个相机的世界位置,然后把你的in_Position带到世界空间(我不知道他们目前在哪个空间),并由此创建一个归一化向量。然后用一个世界空间法向量来反映它,然后对你的立方体地图进行采样。

票数 2
EN

Stack Overflow用户

发布于 2015-04-27 06:23:35

好吧,我找到答案了,

我的问题是我用ViewSpace做了计算,这就是为什么反射是静态的。我的NormalMatrix也在ViewSpace。

所以修正是

代码语言:javascript
代码运行次数:0
运行
复制
ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);

并将法线矩阵从视图空间转换为模型空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29816187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档