首页 > 解决方案 > 简单的 Shadertoy 到常规的 glsl

问题描述

我希望将 glslSandBox 中的代码转换为常规 glsl。假设我有一个在 3D 场景中置换的四边形网格 3D。我想创建这个“shadertoy-like”纹理并应用到它。我知道它需要的转换:Screen - NDC - CLIPSPACE - WORLDSPACE,但我仍然在挣扎。http://glslsandbox.com/e#61091.0这是一个非常简单的着色器,您能否演示将其应用于 3D 场景中的 3D 网格所需的普通 vs 和 fs 着色器?

标签: openglshaderfragment-shadervertex-shader

解决方案


您链接的着色器是在平面屏幕平面上绘制的片段着色器。

通常,相应的顶点设置将是两个三角形(可能是条形,意味着总共 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; 无需进行其他更改。


推荐阅读