两种方法给OpenGL中多个物体应用不同的颜色

第一种方法:在绘制过程中通过uniform变量将颜色信息传给GPU:

1. 首先绘制程序定义变量:

GLuint oc;

2. 片段着色器中添加

uniform vec3 objectColor;

3. 模型绘制前(循环中)加上:

oc=glGetUniformLocation(renderingProgram,"objectColor");

4. 根据需要的颜色定义:

glm::vec3 objectColor(1.0f, 0.0f, 0.0f);

5. 将值传给uniform变量

glUniform3fv(oc,1,glm::value_ptr(objectColor));

这样,就能根据需要变换不同的颜色了。

也可以通过函数将颜色值放到顶点数组中,和顶点一起传送给GPU处理:

1. //函数用来将颜色值添加到坐标值+法向值后面;第一个变量是顶点数组,第二个是数组长度, 第三个是颜色信息,第四个容器用于输出

        void appendColor(float * vertex,int vectexLen,float * color,vector<float> &vec)
        {
            //函数中如果要返回数组,需要定义成static(局部变量无法引用)
            //但是这时候要求数组的维数固定,所以最好是将数组部分拿到函数外面
            for(int m=0;m<vectexLen;m++)
            {
                vec.push_back(vertex[m]);
                if((m+1)%6==0)
                {
                    vec.push_back(color[0]);
                    vec.push_back(color[1]);
                    vec.push_back(color[2]);
                }
            }
        }

        //正方形有6个面,每个面有两个三角形,每个三角形有三个顶点,每个顶点有三个坐标

        //有6*2*3*3=108个坐标值,加上法向坐标值,共有216个数值

        float vertex[216]={
        -1.0f,1.0f,-1.0f,0.0f,0.0f,-1.0f,
        -1.0f,-1.0f,-1.0f,0.0f,0.0f,-1.0f,
        1.0f,-1.0f,-1.0f,0.0f,0.0f,-1.0f,
        1.0f,-1.0f,-1.0f,0.0f,0.0f,-1.0f,
        1.0f,1.0f,-1.0f,0.0f,0.0f,-1.0f,
        -1.0f,1.0f,-1.0f,0.0f,0.0f,-1.0f,

        1.0f,-1.0f,-1.0f,1.0f,0.0f,0.0f,
        1.0f,-1.0f,1.0f,1.0f,0.0f,0.0f,
        1.0f,1.0f,-1.0f,1.0f,0.0f,0.0f,
        1.0f,-1.0f,1.0f,1.0f,0.0f,0.0f,
        1.0f,1.0f,1.0f,1.0f,0.0f,0.0f,
        1.0f,1.0f,-1.0f,1.0f,0.0f,0.0f,

        1.0f,-1.0f,1.0f,0.0f,0.0f,1.0f,
        -1.0f,-1.0f,1.0f,0.0f,0.0f,1.0f,
        1.0f,1.0f,1.0f,0.0f,0.0f,1.0f,
        -1.0f,-1.0f,1.0f,0.0f,0.0f,1.0f,
        -1.0f,1.0f,1.0f,0.0f,0.0f,1.0f,
        1.0f,1.0f,1.0f,0.0f,0.0f,1.0f,

        -1.0f,-1.0f,1.0f,-1.0f,0.0f,0.0f,
        -1.0f,-1.0f,-1.0f,-1.0f,0.0f,0.0f,
        -1.0f,1.0f,1.0f,-1.0f,0.0f,0.0f,
        -1.0f,-1.0f,-1.0f,-1.0f,0.0f,0.0f,
        -1.0f,1.0f,-1.0f,-1.0f,0.0f,0.0f,
        -1.0f,1.0f,1.0f,-1.0f,0.0f,0.0f,

        -1.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,
        1.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,
        1.0f,-1.0f,-1.0f,0.0f,-1.0f,0.0f,
        1.0f,-1.0f,-1.0f,0.0f,-1.0f,0.0f,
        -1.0f,-1.0f,-1.0f,0.0f,-1.0f,0.0f,
        -1.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,

        -1.0f,1.0f,-1.0f,0.0f,1.0f,0.0f,
        1.0f,1.0f,-1.0f,0.0f,1.0f,0.0f,
        1.0f,1.0f,1.0f,0.0f,1.0f,0.0f,
        1.0f,1.0f,1.0f,0.0f,1.0f,0.0f,
        -1.0f,1.0f,1.0f,0.0f,1.0f,0.0f,
        -1.0f,1.0f,-1.0,0.0f,1.0f,0.0f
    };

    //下面这段程序使用容器在顶点后面加上颜色数据,然后再将数据转为数组
    float color1[]={0.0f,0.0f,1.0f};
    int lenver=sizeof(vertex)/sizeof(float);

    vector<float> vec1;
    appendColor(vertex,lenver,color1,vec1);
    int n = vec1.size();
    float arr1[n];
    for(int i=0; i<n; i++){
        arr1[i] = vec1[i];
    }

2. 在顶点着色器中定义输入变量:

        layout (location=0) in vec3 position;

        layout (location=1) in vec3 innormal;

        layout (location=2) in vec3 VertexColor;

3. 解释并缓存数据

        //启用指定属性
        glEnableVertexAttribArray(0);
        //数据解释:顶点着色器中location的值;顶点属性的维数;数据的类型;是否数据被标准化;步长,0-让OpenGL自己去识别;起始位置的偏移量
        glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)0);

        //启用指定属性
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(3*sizeof(float)));

        //启用指定属性
        glEnableVertexAttribArray(2);
        glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(6*sizeof(float)));

        glBufferData(GL_ARRAY_BUFFER, sizeof(arr1), arr1, GL_STATIC_DRAW);

4. 直接绘制图形

        glBindVertexArray(vao[0]);
        glDrawArrays(GL_TRIANGLES,0,36);
        glBindVertexArray(0);

截图中的图片经过了渲染,有光照效果,否则看上去边角不清楚。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值