【问题标题】:Vertex shaders in and out?顶点着色器进出?
【发布时间】:2016-06-22 03:11:30
【问题描述】:

我有两个这样的着色器:

const char* vertexShaderData =
"#version 450 \n" 
"in vec3 vp;"
"in vec3 color;\n"
"out vec3 Color;\n"
"void main(){"
"Color=color;"
"gl_Position = vec4(vp, 1.0);" 
"}";

const char* fragShaderData =
"#version 410\n"
"uniform vec4 incolor;\n"
"in vec3 Color;"
"out vec4 outColor;"
"void main(){"
"outColor = vec4(Color, 1.0);"
"}";

我知道每个顶点都会调用每个着色器。

  1. 我的vertexShaderData 中的in 参数在哪里获取它们的值?在代码中,我没有指定 vp 是什么或颜色是什么。在第二个着色器中,我知道 invalue 来自第一个着色器的 out 值。但是最初的ins 是从哪里来的呢?
  2. 关于fragShaderDataout 值:这个值是如何使用的?换句话说,OpenGL 是如何知道这是一个 RGB 颜色值并知道用这种颜色绘制三角形的?

【问题讨论】:

  • A rather good OpenGL tutorial 应该能解释您需要的大部分内容。
  • 他们从你用glbind绑定到GL上下文的缓冲区中获取它们
  • @G.M.好的,谢谢,我使用的是 open.gl

标签: c++ opengl shader


【解决方案1】:
  1. 对于顶点着色器,

您可以在 C++ 中使用 glGetAttribLocation 来获取驱动程序分配的位置,或者像这样手动设置它:在 GLSL 中使用 layout (location = 0) in vec3 vp; 来获取属性的位置。然后你像这样在 C++ 中上传数据:

    // (Vertex buffer must be bound at this point)
    glEnableVertexAttribArray( a ); // 'a' would be 0 if you did the latter
    glVertexAttribPointer( a, 3, GL_FLOAT, GL_FALSE, sizeof( your vertex ), nullptr );

对于片段着色器,

'in' 变量必须与顶点着色器的'out' 变量匹配,例如在您的示例代码out vec3 Color; -> in vec3 Color;

  1. gl_Position 控制绘制 outColor 的位置。

【讨论】:

    【解决方案2】:
    1. 您从 OpenGL 调用(在 CPU 中)将数据提供给顶点着色器。一旦你编译了程序(顶点着色器 + 片段着色器),你就可以输入你想要的顶点。

    2. 与顶点着色器不同,此片段着色器将为您正在渲染的三角形内的每个像素运行一次。 outColor 将是“进入帧缓冲区”的 vec4 (R,G,B,A)。关于颜色,理论上,这是 OpenGL 的抽象。为方便起见,它们被称为 RGBA……您甚至可以访问与 XYZW 相同的数据(它是 RGBA 的别名)。 OpenGL 会将 NUMBERS 输出到您想要的帧缓冲区(根据颜色附件等规则)。实际上,您将有 4 个通道,顺便说一下,这些通道在监视器中用于输出 RGB(而 A 用于透明度)....换句话说,您可以使用 GL 程序创建将输出 1 个通道或 2 个通道的三角形渠道,取决于您的需要,这些渠道可能意味着您需要的任何东西。例如,您可以插值和 YUV 图像,或 UV 平面(2 个通道)。如果将这些输出到监视器,一旦监视器期望 RGB,您将无法获得正确的颜色,但是 OpenGL 的概念比 RGB 更广泛。它将为三角形内的每个像素插入数字。就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2016-03-24
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多