Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >GLSL cubemap反射着色器

GLSL cubemap反射着色器
EN

Stack Overflow用户
提问于 2015-04-22 23: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 06:00:17

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-04-26 22: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

复制
相关文章
UnityShader 表面着色器简单例程集合
0.前言 这些简单的shader程序都是写于2015年的暑假。当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目。这些文章闲置在我个人博客中,一年将过,师弟也到了学shader的时候,这些例程虽然很简单,刚接触shader时却可以练练手,所以从个人博客中中搬了出来。而对于有一个月以上shaderLab编程经验的同学来说,这篇文章可以不用看了:-) 1.表面着色器概述 表面着色器只存在于Unity中,算是Unity微创新自创的一套着色器标准。它使得shader的书写门槛降
Tencent JCoder
2018/07/02
3.2K1
Shader实例:高级纹理应用
第一种方法:就是提供一张具有特殊布局的纹理(如:立方体展开贴图交叉布局,全景布局等)用的时候把Texture Type设置成Cubemap(优点:这种方法可以对纹理数据进行压缩,而且可以支持边缘修正,光滑反射和HDR等功能);
bering
2019/12/03
5160
three.js 着色器材质之glsl内置函数
郭先生发现在开始学习three.js着色器材质时,我们经常会无从下手,辛苦写下的着色器,也会因莫名的报错而手足无措。原因是着色器材质它涉及到另一种语言--GLSL,只有懂了这个语言,我们才能更好的写出着色器材质,利用好的我们的GPU。
郭先生的博客
2020/08/28
1.8K0
Unity3D-光照系统之反射探头
用于捕获周围环境的光反射信息,捕获的图像将被存储为Cubemap和能在游戏对象上使用的反射材质。多个反射探头,可以根据周围环境的变化而得到逼真的效果
孙寅
2020/06/02
1.6K0
Github霸榜:从零开始学3D着色器编程
Shader,是运行在GPU上的程序,中文称为着色器。它的主要用途是对三维物体进行着色处理,对光与影进行计算,以及控制纹理颜色的呈现等,最终,将游戏引擎中的几何数据转化为屏幕上的模型、场景以及特效。
新智元
2019/05/17
2.1K0
Github霸榜:从零开始学3D着色器编程
Unity基础(4)-资源管理知识(1)
Project窗口下的Assets文件夹下,就是用来存放资源的,为了方便,会使用文件夹的方式来对资源进行管理。但是也有一些特殊文件夹
孙寅
2020/06/02
2.4K0
关于材质球中渲染光照一些理解
Specular Highlights:镜面光 Reflection: 遮罩反射 一个Cubemap 一个texture来描述我们对象的那些部分是可以反射的,而哪些不可以。记住,黑色表示没有任何反射性,而白色表示可以完全反射。下面的图片是我们将会用到的texture
孙寅
2020/06/02
7780
OPengl、DirectX、OPenCV、OpenCL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
sofu456
2019/10/22
2.2K0
七天近 1000 Star!哈佛小哥这个 GitHub 仓库从零开始教你计算机图形学
计算机图形学被称为计算机「三大浪漫」之一,这个 GitHub 仓库将帮助迷茫的你快速入门。
GitHubDaily
2021/05/18
1.6K0
七天近 1000 Star!哈佛小哥这个 GitHub 仓库从零开始教你计算机图形学
OpenGL与OpenGL在移动端的应用
OpenGL首先我们从字面意思来理解:Open Graphics Library,开放的图形库,图形库自然是处理图形的,所以简单来说OpenGL就是用来处理图形的一个三方库。 稍微技术流一点,作如下解释:是用于渲染2D,3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。
清墨
2019/11/15
2.7K0
OpenGL与OpenGL在移动端的应用
GLSL版本的区别和对比
之前尝试将一个GLSL version 110的版本写成GLSL version 330的,在此将学习过程和收获记录下来。
Zoctopus
2018/12/14
4.8K0
Shader经验分享
流水线 1.应用阶段:(CPU)输出渲染图元,粗粒度剔除等 比如完全不在相机范围内的需要剔除,文件系统的粒子系统实现就用到粗粒度剔除。 2.几何阶段:(GPU)把顶点坐标转换到屏幕空间,包含了模型空间 到世界空间 到观察空间(相机视角view) 到齐次裁剪空间(投影project2维空间,四维矩阵,通过-w<x<w判断是否在裁剪空间) 到归一化设备坐标NDC(四维矩阵通过齐次除法,齐次坐标的w除以xyz实现归一化) 到屏幕空间(通过屏幕宽高和归一化坐标计算)。 a.顶点着色器:坐标变换和逐顶点光照,将顶点空间转换到齐次裁剪空间。 b.曲面细分着色器:可选 c.几何着色器:可选 d.裁剪:通过齐次裁剪坐标的-w<x<w判断不在视野范围内的部分或者全部裁剪,归一化。 e.屏幕映射:把NDC坐标转换为屏幕坐标 3.光栅化阶段:(GPU)把几何阶段传来的数据来产生屏幕上的像素,计算每个图元覆盖了哪些像素,计算他们的颜色、 a.三角形设置:计算网格的三角形表达式 b.三角形遍历:检查每个像素是否被网格覆盖,被覆盖就生成一个片元。 c.片元着色器:对片元进行渲染操作 d.逐片元操作:模板测试,深度测试 混合等 e.屏幕图像 ------------------------------------------------------- 矩阵: M*A=A*M的转置(M是矩阵,A是向量,该公式不适合矩阵与矩阵) 坐标转换: o.pos = mul(UNITY_MATRIX_MVP, v.vertex);顶点位置模型空间到齐次空间 o.worldNormal = mul((float3x3)_Object2World,v.normal);//游戏中正常的法向量转换,转换后法向量可能不与原切线垂直,但是不影响游戏显示,而且大部分显示也是差不多的。一般用这个就行了。 o.worldNormal = mul(v.normal, (float3x3)_World2Object);顶点法向量从模型空间转换到世界空间的精确算法,公式是用_Object2World该矩阵的逆转置矩阵去转换法线。然后通过换算得到该行。 ------------------------------------------------------- API: UNITY_MATRIX_MVP 将顶点方向矢量从模型空间变换到裁剪空间 UNITY_MATRIX_MV 将顶点方向矢量从模型空间变换到观察空间 UNITY_MATRIX_V 将顶点方向矢量从世界空间变换到观察空间 UNITY_MATRIX_P 将顶点方向矢量从观察空间变换到裁剪空间 UNITY_MATRIX_VP 将顶点方向矢量从世界空间变换到裁剪空间 UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵 UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间转换到观察空间 _Object2World将顶点方向矢量从模型空间变换到世界空间,矩阵。 _World2Object将顶点方向矢量从世界空间变换到模型空间,矩阵。 模型空间到世界空间的矩阵简称M矩阵,世界空间到View空间的矩阵简称V矩阵,View到Project空间的矩阵简称P矩阵。 --------------------------------------------- _WorldSpaceCameraPos该摄像机在世界空间中的坐标 _ProjectionParams _ScreenParams _ZBufferParams unity_OrthoParams unity_Cameraprojection unity_CameraInvProjection unity_CameraWorldClipPlanes[6]摄像机在世界坐标下的6个裁剪面,分别是左右上下近远、 ---------------------------- 1.表面着色器 void surf (Input IN, inout SurfaceOutput o) {}表面着色器,unity特殊封装的着色器 Input IN:可以引用外部定义输入参数 inout SurfaceOutput o:输出参数 struct SurfaceOutput//普通光照 { half3 Albedo;//纹理,反射率,是漫反射的颜色值 half3 Normal;//法线坐标 half3 Emission;//自发光颜色 half Specular;//高光,镜面反射系数 half Gloss;//光泽度 half Alpha;//alpha通道 } 基于物理的光照模型:金属工作流Surfa
bering
2019/12/03
2.1K0
WebGL2系列之从WebGL1迁移到WebGL2
WebGL2并非所有的浏览器都支持,所以比较鲁棒的方式是,判断如果不存在WebGL2上下文,则回退使用WebGL1,代码如下:
用户3158888
2019/05/28
1.9K0
iOS开发-OpenGL ES入门教程2
教程 OpenGLES入门教程1-Tutorial01-GLKit 这次的是shader编译链接、glsl入门和简单图形变换。 OpenGL ES系列教程在这里。 OpenGL ES系列教程的代码
落影
2018/04/27
1.2K0
iOS开发-OpenGL ES入门教程2
【Shader】Shader官方示例[通俗易懂]
官方示例原文地址:https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
全栈程序员站长
2022/07/31
1K0
【Shader】Shader官方示例[通俗易懂]
18.opengl高级-立方体贴图
立方体贴图在《视觉计算基础》一书中,第14章的环境贴图中有讲到,常见的环境贴图有立方体环境贴图和球体环境贴图,根据实际场景来区分使用,比如你想创建一个四四方方的房间环境,就用立方体贴图。原理也不复杂,可以根据相机视角映射到对应的纹理像素上。
公号sumsmile
2020/07/13
1.1K0
18.opengl高级-立方体贴图
OpenGL ES for Android 世界
大家好,本文是 iOS/Android 音视频专题的第五篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复资料 获取项目地址。
100001509164
2022/01/20
1.2K0
OpenGL ES for Android 世界
OpenGL ES _ 着色器_预处理器
编译GLSL 着色器的第一个步骤是由预处理进行解析的。你可能还是不知道干啥的,它的作用就是删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。
酷走天涯
2018/09/14
1.3K1
音视频开发之旅(42)-光照基础(一)
环境光(Ambient Lightiing)不来自任何特定方向的光,在经典光照模型中会用一个常量来表示 使用时只需要对其片源着色器添加一个环境光常量,作为gl_Fragcolor的调制即可_
音视频开发之旅
2021/04/19
5570
音视频开发之旅(42)-光照基础(一)
shader 4 杂 一些和函数名词、数据结构
Bump mapping: 凹凸贴图;模拟粗糙外表面的技术。 FX-Water simple.shader中即用到了。模拟波浪效果。
全栈程序员站长
2022/07/09
3890

相似问题

使用GLSL显示Cubemap

10

GLSL - PBR着色器-无法渲染漫反射IBL组件

20

GLSL着色器- 2D对象的Coverflow反射

10

理解Opengl着色器代码- cubemap?

12

如何使用Cubemap制作房间反射

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文