5.Shader

1.使用in、out关键字声明shader中的输入和输出变量

    为输入变量传值有两种方式:

        (1)在着色器中声明变量时使用location = t关键字指定顶点属性位置(顶点着色器需要提供一个额外的layout标识),在程序中通过t进行赋值

        (2)在程序中使用glGetAttribLocation(变量名)获取变量的地址,然后再进行赋值

2.在顶点着色器和片元着色器之间传值:

    如果我们打算从一个着色器向另一个着色器发送数据,在发送方着色器声明一个输出变量,在接收方着色器声明一个输入变量,当两个变量名字和类型一样时,OpenGL就会将两个变量链接在一起

const char * vertexShaderSource =
       "#version 330 core\n"
       "layout(location = 0) in vec3 aPos;\n"     
       "out vec4 vertexColor;\n"
       "void main(){\n"
       "gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0f);\n"
       "vertexColor = vec4(0.5,0.0,0.0,1.0);\n"
       "}\0";
const char* fragementShaderSource =
       "#version 330 core\n"
       "out vec4 FragColor;\n"
       "in vec4 vertexColor;"
       "void main(){\n"
       "FragColor = vertexColor;\n"
       "}";

3.uniform变量,uniform变量是从CPU应用向GPU发送数据的一种方式,uniform变量有以下两个特点:

    (1)uniform变量是全局变量,在所有着色器中都是独一无二的,而且可以被着色器程序的任意着色器在任意阶段访问

    (2)uniform会一直保存变量的数据,直到被更新或重置

定义uniform变量并赋值:(注意赋值前必须先使用程序)

const char* fragementShaderSource =
       "#version 330 core\n"
       "out vec4 FragColor;\n"
       "uniform vec4 mycolor;\n"
       "void main(){\n"
       "FragColor = mycolor;\n"
       "}\n\0";

main()
{
    //当变量不存在时返回-1
    int mycolorLocation = glGetUniformLocation(shaderProgram,"mycolor");
    glUniform4f(mycolorLocation,0.0f,color,0.0f,1.0f);
}

4.使用多个顶点属性,同webGL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值