opengl - 简单的 Shadertoy 到常规的 glsl
问题描述
我希望将 glslSandBox 中的代码转换为常规 glsl。假设我有一个在 3D 场景中置换的四边形网格 3D。我想创建这个“shadertoy-like”纹理并应用到它。我知道它需要的转换:Screen - NDC - CLIPSPACE - WORLDSPACE,但我仍然在挣扎。http://glslsandbox.com/e#61091.0这是一个非常简单的着色器,您能否演示将其应用于 3D 场景中的 3D 网格所需的普通 vs 和 fs 着色器?
解决方案
您链接的着色器是在平面屏幕平面上绘制的片段着色器。
通常,相应的顶点设置将是两个三角形(可能是条形,意味着总共 4 个顶点),覆盖整个屏幕。实际上,您不必真正关心任何转换,尤其是考虑到 fs 使用gl_FragCoord
并且分辨率作为统一传递。
对比:
#version 450
in vec4 position;
void main() {
gl_Position = position
}
顶点(例如,与 一起使用GL_TRIANGLE_STRIP
):
-1, -1
-1, 1
1, -1
1, 1
覆盖整个屏幕后,您现在可以切换此设置以渲染到纹理;创建一个帧缓冲区,将纹理附加到它,并以相同的方式渲染。然后您就可以在您的 3D 模型上使用该纹理。如果生成的图像很少更改,这将很好地工作。
如果您真的想一次性绘制,那么您需要将纹理坐标作为可变变量传递,并使用它而不是gl_FragCoord
; 无需进行其他更改。
推荐阅读
- android - 如何在 Firebase 数据库中获取内部孩子的数据?
- java - IntelliJ 不会解析使用 mvc:resources 定义的路径
- three.js - 如何使用 Threejs 实现两个对象之间的捕捉效果和碰撞检测?
- python - 如何使用 arviz 识别 pymc3 链中的分歧
- python - 使用python编码数据集的字符串列
- npm - 由于 CentOS 7 上的 webpack 错误,nextjs 构建失败
- python - 通过 nltk 访问英国国家语料库
- c# - 在单声道中构建 c#“.NET 5.0”时出现错误 MSB4186
- python - time.process_time() 打印'e-xx'
- c# - WPF 拦截 GoBack() 事件