U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 土豆PE使用教程 >

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

来源:http://www.tudoupe.com时间:2022-02-10

第一种方法:在绘制过程中通过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);

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

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息