#include<windows.h>
#include<stdio.h>
#include <stdlib.h>
#include <gl/glew.h>
#include <gl/glut.h>
#include "textfile.h"
#include "debugInfo.h"
#define MIN_INSERTION 2
#define MAX_INSERTION 16
bool shader_flag = false;
float eye[] = {0.0, 0.0, 8.0};
float center[] = {0.0, 0.0, 0.0};
int left_click = GLUT_UP;
int xold;
int yold;
float rotation_x = 0;
float rotation_y = 0;
int wHeight = 0;
int wWidth = 0;
GLuint vertex_shader;
GLuint fragment_shader;
GLuint tcs_shader;
GLuint tes_shader;
GLuint shader_program;
GLuint vertex_buffer;
GLuint lineIndexBuffer;
GLuint vao;
GLfloat vertices[] = {2,2,0, -2,2,0, -2,-2,0, 2,-2,0};
GLuint line_index[] = {0,1, 1,2, 2,3, 3,0};
float model_view_matrix[16];
float projection_matrix[16];
int edge_insertion_num = 2;
int face_insertion_num = 2;
void DrawScene()
{
glEnableVertexAttribArray(0);
glBindVertexArray(vao);
glVertexAttribPointer(0,3,GL_FLOAT,GL_TRUE,0,0);
if(shader_flag)
{
glPatchParameteri(GL_PATCH_VERTICES,4);
glDrawArrays(GL_PATCHES, 0,4);
}
else
{
glDrawArrays(GL_LINES, 0,4);
}
glBindVertexArray(0);
glDisableVertexAttribArray(0);
}
void redraw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2],
center[0], center[1], center[2],
0, 1, 0);
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_pos[] = {5,5,5,1};
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, white);
glEnable(GL_LIGHT0);
glRotatef(rotation_y, 1, 0, 0);
glRotatef(rotation_x, 0, 1, 0);
if(shader_flag)
{
glUseProgram(shader_program);
glGetFloatv(GL_MODELVIEW_MATRIX,model_view_matrix);
glGetFloatv(GL_PROJECTION_MATRIX,projection_matrix);
glUniformMatrix4fv(glGetUniformLocation(shader_program,"ModelViewMatrix"),1,GL_FALSE,model_view_matrix);
glUniformMatrix4fv(glGetUniformLocation(shader_program,"ProjectionMatrix"),1,GL_FALSE,projection_matrix);
glUniform1i(glGetUniformLocation(shader_program,"edge_tess_num"),edge_insertion_num);
glUniform1i(glGetUniformLocation(shader_program,"face_tess_num"),face_insertion_num);
}
else
{
glUseProgram(0);
}
DrawScene();
glutSwapBuffers();
}
void updateView(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float whRatio = (GLfloat)width/(GLfloat)height;
gluPerspective(45.0f, whRatio,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}
void reshape(int width, int height)
{
if (height==0)
{
height=1;
}
wHeight = height;
wWidth = width;
updateView(wHeight, wWidth);
}
void idle()
{
glutPostRedisplay();
}
void key(unsigned char k, int x, int y)
{
switch(k)
{
case 27:
{
exit(0);
}
case 's':
{
shader_flag = !shader_flag;
break;
}
case 'i':
{
edge_insertion_num = (edge_insertion_num<=MIN_INSERTION)?MIN_INSERTION:edge_insertion_num-1;
break;
}
case 'o':
{
edge_insertion_num = (edge_insertion_num>=MAX_INSERTION)?MAX_INSERTION:edge_insertion_num+1;
break;
}
case 'k':
{
face_insertion_num = (face_insertion_num<=MIN_INSERTION)?MIN_INSERTION:face_insertion_num-1;
break;
}
case 'l':
{
face_insertion_num = (face_insertion_num>=MAX_INSERTION)?MAX_INSERTION:face_insertion_num+1;
break;
}
}
}
void MouseFunc(int button, int state, int x, int y)
{
if (GLUT_LEFT_BUTTON == button)
{
left_click = state;
}
xold = x;
yold = y;
}
void MotionFunc(int x, int y)
{
if (GLUT_DOWN == left_click)
{
rotation_y = rotation_y + (y - yold) / 3.0;
rotation_x = rotation_x + (x - xold) / 3.0;
if (rotation_y > 90)
{
rotation_y = 90;
}
if (rotation_y < -90)
{
rotation_y = -90;
}
glutPostRedisplay ();
}
xold = x;
yold = y;
}
void setShader()
{
char *vs_edge = NULL;
char *fs_edge = NULL;
char *tcs_edge = NULL;
char *tes_edge =NULL;
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
tcs_shader = glCreateShader(GL_TESS_CONTROL_SHADER);
tes_shader = glCreateShader(GL_TESS_EVALUATION_SHADER);
vs_edge = textFileRead("edge.vert");
fs_edge = textFileRead("edge.frag");
tcs_edge = textFileRead("edge.tcs");
tes_edge = textFileRead("edge.tes");
const char * vs = vs_edge;
const char * fs = fs_edge;
const char * tcs = tcs_edge;
const char * tes = tes_edge;
glShaderSource(vertex_shader, 1, &vs,NULL);
glShaderSource(fragment_shader, 1, &fs,NULL);
glShaderSource(tcs_shader,1,&tcs,NULL);
glShaderSource(tes_shader,1,&tes,NULL);
free(vs_edge);
free(fs_edge);
free(tcs_edge);
free(tes_edge);
glCompileShader(vertex_shader);
glCompileShader(fragment_shader);
glCompileShader(tcs_shader);
glCompileShader(tes_shader);
shader_program = glCreateProgram();
glAttachShader(shader_program,vertex_shader);
glAttachShader(shader_program,fragment_shader);
glAttachShader(shader_program,tcs_shader);
glAttachShader(shader_program,tes_shader);
glLinkProgram(shader_program);
printf("vert:\n");
printShaderInfoLog(vertex_shader);
printf("\nfrag:\n");
printShaderInfoLog(fragment_shader);
printf("\ntcs:\n");
printShaderInfoLog(tcs_shader);
printf("\ntes:\n");
printShaderInfoLog(tes_shader);
}
void init()
{
setShader();
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER,100,vertices,GL_STATIC_DRAW);
glGenBuffers(1, &lineIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 100, line_index, GL_STATIC_DRAW);
}
int main (int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(480,480);
glutCreateWindow("Tess");
glutDisplayFunc(redraw);
glutReshapeFunc(reshape);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glutMouseFunc(MouseFunc);
glutMotionFunc(MotionFunc);
glewInit();
if (glewIsSupported("GL_VERSION_4_0"))
{
printf("Ready for OpenGL 2.0\n");
}
else
{
printf("OpenGL 2.0 not supported\n");
exit(1);
}
init();
glutMainLoop();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
GLSL Tessellation Shader简单示例
共56个文件
tlog:22个
dll:4个
obj:3个
2星 需积分: 34 27 下载量 64 浏览量
2015-05-15
10:32:19
上传
评论
收藏 7.06MB RAR 举报
温馨提示
GLSL Tessellation Shader简单示例,对一个四边形平面进行双线性插值细分
资源推荐
资源详情
资源评论
收起资源包目录
GLSL_TESS.rar (56个子文件)
GLSL_test
GLSL_test.sln 894B
Debug
glut32.dll 232KB
GLSL_test.ilk 378KB
GLSL_test.exe 41KB
glew32.dll 297KB
GLSL_test.pdb 651KB
GLSL_test.v12.suo 51KB
GLSL_test.v11.suo 50KB
GLSL_test.sdf 30.81MB
GLSL_test
main.cpp 6KB
GLSL_test.vcxproj 5KB
glut32.dll 232KB
textfile.cpp 1KB
debugInfo.cpp 984B
textfile.h 371B
GLSL_test.vcxproj.filters 2KB
edge.frag 106B
glew32.dll 297KB
Debug
debugInfo.obj 9KB
link.read.1.tlog 4KB
link.4580-rc.read.1.tlog 2B
link-cvtres.read.1.tlog 2B
link.command.1.tlog 2KB
vc110.pdb 148KB
link.4580-cvtres.write.1.tlog 2B
link.4580-cvtres.read.1.tlog 2B
CL.write.1.tlog 2KB
GLSL_test.log 437B
vc120.idb 883KB
cl.command.1.tlog 2KB
vc110.idb 499KB
link-cvtres.write.1.tlog 2B
link-rc.write.1.tlog 2B
link.4580-rc.write.1.tlog 2B
link.4580.write.1.tlog 2B
GLSL_test.lastbuildstate 84B
textfile.obj 7KB
main.obj 56KB
CL.read.1.tlog 23KB
GLSL_test.tlog
link.read.1.tlog 4KB
link.command.1.tlog 3KB
CL.write.1.tlog 2KB
cl.command.1.tlog 4KB
GLSL_test.lastbuildstate 167B
CL.read.1.tlog 24KB
link.write.1.tlog 708B
vc120.pdb 164KB
link.write.1.tlog 912B
link-rc.read.1.tlog 2B
GLSL_test.Build.CppClean.log 3KB
link.4580.read.1.tlog 2B
edge.tes 542B
edge.vert 119B
debugInfo.h 121B
edge.tcs 518B
GLSL_test.vcxproj.user 164B
共 56 条
- 1
资源评论
- 有时想起2021-08-16很不错的资源,正在学习中。
sspigs
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功