OpenGL学习笔记四(用自己编写的着色器绘制花托)

 程序代码如下:

#include <GLTools.h>
#include <GLFrustum.h>
#include <StopWatch.h>
#include <GLMatrixStack.h>
#include <GLGeometryTransform.h>

#define FREEGLUT_STATIC
#include <GL/glut.h>

GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLFrustum viewFrustum;
GLGeometryTransform transformPipeLine;
GLTriangleBatch batch;

GLint flatShader;
GLint location_color;
GLint location_matrix;

void SetupRC()
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	gltMakeTorus(batch, 0.8f, 0.25, 50, 25);
	//设置绘图模式为线模式
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	//加载顶点程序文件和片段程序文件,指定一个属性参数:顶点
	//颜色和变换矩阵通过设置统一值传入
	flatShader = gltLoadShaderPairWithAttributes("flatShader.vp", "flatShader.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex");
	location_color = glGetUniformLocation(flatShader, "vColor");
	location_matrix = glGetUniformLocation(flatShader, "transformMatrix");
}

void RenderScene()
{
	static CStopWatch watch;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	GLfloat vColor[] = {0.0f, 0.0f, 1.0f, 1.0f};

	modelViewMatrix.PushMatrix();
	modelViewMatrix.Translate(0.0f, 0.0f, -4.0f);
        modelViewMatrix.Rotate(watch.GetElapsedSeconds()*60.0f, 0.0f, 1.0f, 0.0f);
	glUseProgram(flatShader);
	//设置颜色统一值和统一变换矩阵
	glUniform4fv(location_color, 1, vColor);
	glUniformMatrix4fv(location_matrix, 1, GL_FALSE, transformPipeLine.GetModelViewProjectionMatrix());
	batch.Draw();
	modelViewMatrix.PopMatrix();

	glutSwapBuffers();
	glutPostRedisplay();
}

void ChangeSize(int w, int h)
{
	glViewport(0, 0, w, h);
	//创建模型视图投影矩阵
	viewFrustum.SetPerspective(35.0f, float(w)/h, 1.0f, 100.0f);
        projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
	modelViewMatrix.LoadIdentity();
	transformPipeLine.SetMatrixStacks(modelViewMatrix, projectionMatrix);
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

	glutInitWindowSize(800, 600);
	glutCreateWindow("show");

	glutReshapeFunc(ChangeSize);
	glutDisplayFunc(RenderScene);

	GLenum ret = glewInit();
	if (GLEW_OK != ret)
	{
		fprintf(stderr, "glew err: %s", glewGetErrorString(ret));
		return 1;
	}

	SetupRC();
	glutMainLoop();
	return 0;
}

 顶点着色器程序如下,将文件保存为“flatShader.vp”放置在工程目录下:

#version 130

in vec4 vVertex;
uniform mat4 transformMatrix;//变换矩阵统一值

void main(void)
{
    gl_Position = transformMatrix * vVertex;
}

片段着色器如下,将文件保存为“flatShader.fp”放置在工程目录下:

#version 130

uniform vec4 vColor;//颜色统一值
out vec4 vFragColor;

void main(void)
{
    vFragColor = vColor;
}

 效果和OpenGL自带的着色器一样:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值