顶点着色器进出?

时间:2016-06-21 18:00:56

标签: c++ opengl shader

我有两个这样的着色器:

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. in中的vertexShaderData paremters在哪里获得价值?代码中的任何一点都不指定vp是什么或颜色是什么。在第二个着色器中,我得到in值来自第一个着色器的out值。但是,初始in来自何处?
  2. 关于out的{​​{1}}值:如何使用此值?换句话说,OpenGL如何知道这是一个RGB颜色值并知道用这种颜色绘制三角形?

2 个答案:

答案 0 :(得分:1)

  1. 您可以从OpenGL调用(在CPU中)将数据提供给顶点着色器。编译完程序(顶点着色器+片段着色器)后,就可以提供所需的顶点。

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

答案 1 :(得分:1)

  1. 对于顶点着色器,
  2. 您可以在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的绘制位置。