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

使用上一篇文章的代码

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;
}

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


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页