从OpenGL传颜色数值到Shader,改变绘图颜色

来源:互联网 发布:三菱q系列plc编程收册 编辑:程序博客网 时间:2024/05/16 01:24

使用上一篇文章的代码

OpenGL中使用Shader

http://blog.csdn.net/huutu/article/details/21445287


(1) 定义了三个变量用来存储颜色值的RGB

float colorR,colorG,colorB;

(2) 修改renderScene函数,实现在每一帧都修改上面的三个参数,从而修改颜色值

void renderScene(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0.0,5.0,10.0,0.0,0.0,0.0,0.0f,1.0f,0.0f);glLightfv(GL_LIGHT0,GL_POSITION,lpos);glRotatef(a,0,1,0);glutSolidTeapot(1);a+=0.1;if(a>360){a=a-360;}colorR+=0.001;colorG+=0.002;colorB+=0.003;if(colorR>1.0){colorR=colorR- 1.0;}if(colorG>1.0){colorG=colorG-1.0;}if(colorB>1.0){colorB=colorB-1.0;}glutSwapBuffers();GLuint color_Sh=glGetUniformLocation(p,"color");float color[4]={colorR,colorG,colorB,1.0};glUniform4fv(color_Sh,1,color);}

重点在于获取Shader中的变量 color ,然后给他赋值

GLuint color_Sh=glGetUniformLocation(p,"color");float color[4]={colorR,colorG,colorB,1.0};glUniform4fv(color_Sh,1,color);

(3) 来看Shader的写法

顶点着色器定义变量color,接收OpenGL程序的赋值,同时定义变量 potColor ,用于在顶点着色器与片元着色器中传递变量

uniform vec4 color;varying vec4 potColor;void main(){potColor=color;//gl_Position=gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;//gl_Position=gl_ModelViewProjectionMatrix * gl_Vertex;gl_Position=ftransform();}

将OpenGL传过来的颜色值 赋值给 potColor 。


片元着色器接收 顶点着色器的 potColor 值,设置当前像素为potColor颜色

varying vec4 potColor;void main(){//gl_FragColor=vec4(1.0,0.0,0.0,1.0);gl_FragColor=potColor;}

效果图就是变换颜色的茶壶


0 0