gpt4 book ai didi

c++ - 通过 GLSL 着色器传递数据

转载 作者:行者123 更新时间:2023-11-28 06:35:56 24 4
gpt4 key购买 nike

我在通过我的着色器传递数据时遇到一些问题,尤其是几何着色器。我以前从未使用过几何着色器,所以我在理解它传递数据的方式时遇到了一些困难。

基本上,在几何着色器之前,我会简单地使用输入/输出限定符将数据从顶点着色器传递到片段。就像我有:

顶点着色器!

out vec3 worldNormal;
out vec3 worldView;

片段着色器:

in vec3 ex_worldNorm;
in vec3 ex_worldView;

那么,对于几何着色器,我必须做这样的事情来传递数据吗?

in vec3 ex_worldNorm[];
in vec3 ex_worldView[];

out vec3 ex_worldNorm[];
out vec3 ex_worldNorm[];

我的问题是,如何在每个着色器之间正确传递数据?就像,这是这样做的方法吗? (因为它对我不起作用!)

最佳答案

输入的无界数组对于几何着色器是正确的(大小将由布局限定符中的输入类型决定),但输出不能是数组。

您可以通过将值写入所有输出变量然后调用 EmitVertex (...) 来一次输出一个顶点。在 EmitVertex (...) 调用之间未写入的任何输出变量都将是未定义的。


这是一个非常简单的几何着色器示例,它可以执行您想要的操作:

#version 330


layout (triangles) in; // This will automatically size your two arrays to 3, and also
// defines the value of `gl_in.length ()`

in vec3 worldNormal [];
in vec3 worldView [];

// ^^^ Names match up with Vertex Shader output


layout (triangle_strip, max_vertices = 3) out;

out vec3 ex_worldNorm;
out vec3 ex_worldView;

// ^^^ Names match up with Fragment Shader input


void main (void)
{
// For each input vertex, spit one out
for (int i = 0; i < gl_in.length (); i++) {
ex_worldNorm = worldNormal [i];
ex_worldView = worldView [i];
EmitVertex ();
}
}

关于c++ - 通过 GLSL 着色器传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com