glsl着色器(c语言)

basic.vert
#version 400

layout(location =0) in vec3 VertexPosition;
layout(location =1) in vec3 VertexColor;

out vec3 Color;

uniform mat4 Matrix;

void main()
{
    Color= VertexColor;
	
    gl_Position= Matrix *vec4(VertexPosition,1.0);
}

basic.frag
#version 400  
  
in vec3 Color;  
  
out vec4 FragColor;  
  
void main()  
{  
    FragColor = vec4(Color,1.0);  
}  










主程序main.c


#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>

#include "readtext.h"

#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif


#pragma  comment(lib,"../readtext.lib")
#pragma  comment(lib,"../glew32.lib")



GLuint vShader, fShader,programHandle;

int infologLength = 0;  
int charsWritten  = 0;  
char *infoLog;  

//顶点位置数组  
float positionData[] = {  
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f};  
//颜色数组  
float colorData[] = {  
        0.2f, 0.8f, 0.0f,  
        0.4f, 0.6f, 0.0f,  
        0.1f, 0.9f, 1.0f };  


float matrix[16];


matrix[16] ={0.5 , 0.0, -0.866, 0.0,
	          0.0,  1.0, 0.0, 0.0,
			  0.866 , 0.0, 0.5, 0.0,
			  0.0, 0.0, 0.0, 1.0 };

	/变换矩阵
/
// cos(angle), 0, -sin(angle), //列向量
//0, 1, 0,
//sin(angle), 0,cos(angle)
//


GLint matrixLocation;
GLuint vaoHandle;//vertex array object 


void initShader()
{
	 char *renderer, *vender, *version, *glslVersion;
	 char *vs, *fs;
	 char *vv, *ff;


	 //检测版本
	 renderer = glGetString( GL_RENDERER );  
     vender = glGetString( GL_VENDOR );  
     version = glGetString( GL_VERSION );  
     glslVersion = glGetString( GL_SHADING_LANGUAGE_VERSION );  
     
	 printf("%s \n", renderer);
	 printf("%s \n", vender);
	 printf("%s \n", version);
	 printf("%s \n", glslVersion);
     

	 //着色器处理
     vShader= glCreateShader(GL_VERTEX_SHADER);
	 vs=readText("../basic.vert");
	 printf("%s\n", vs);

	 if(vShader ==0)
	 {
		 printf("fail to creat vertex shader");
		 exit(1);
	 }
	 //将源代码与着色器相关联
	 vv =vs;
	 glShaderSource(vShader, 1, &vv, NULL);
     glCompileShader(vShader);
	 free(vs);

	 //检查是否编译成功

	 
   
     glGetShaderiv(vShader, GL_INFO_LOG_LENGTH,&infologLength);  
   
     if (infologLength > 0)  
     {  
         infoLog = (char *)malloc(infologLength);  
         glGetShaderInfoLog(vShader, infologLength, &charsWritten, infoLog);  
         printf("%s\n",infoLog);  
         free(infoLog);  
     }  
	 //
	 /
	 
	 fShader = glCreateShader(GL_FRAGMENT_SHADER); 
	 if(fShader ==0)
	 {
		 printf("fail to creat shader\n");
		 exit(1);
	 }

	 fs= readText("../basic.frag");
	 printf("%s \n",fs);
	 ff= fs;
	 glShaderSource(fShader, 1, &ff, NULL);
	 glCompileShader(fShader);
	 free(fs);
	 //检查编译是否成功
	 glGetShaderiv(fShader, GL_INFO_LOG_LENGTH,&infologLength);  
     if (infologLength > 0)  
     {  
         infoLog = (char *)malloc(infologLength);  
         glGetShaderInfoLog(fShader, infologLength, &charsWritten, infoLog);  
         printf("%s\n",infoLog);  
         free(infoLog);  
     }  

	 
     //
	 //
	 //创建程序对象
	 programHandle= glCreateProgram();

	 glAttachShader(programHandle, vShader);
	 glAttachShader(programHandle, fShader);

	 glLinkProgram(programHandle); 

	 glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH,&infologLength);  
     if (infologLength > 0)  
     {  
         infoLog = (char *)malloc(infologLength);  
         glGetProgramInfoLog(programHandle, infologLength, &charsWritten, infoLog);  
         printf("%s\n",infoLog);  
         free(infoLog);  
     }  
     glUseProgram(programHandle);  
}



void initVBO()  
{  
    // Create and populate the buffer objects  
    GLuint vboHandles[2];
	GLuint positionBufferHandle, colorBufferHandle;

    glGenBuffers(2, vboHandles);  
    positionBufferHandle = vboHandles[0];  
    colorBufferHandle = vboHandles[1];  
  
    //绑定VBO以供使用  
    glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);  
    //加载数据到VBO  
    glBufferData(GL_ARRAY_BUFFER,12 * sizeof(float),  
        positionData,GL_STATIC_DRAW);  
  
    //绑定VBO以供使用  
    glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);  
    //加载数据到VBO  
    glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),  
        colorData,GL_STATIC_DRAW);  
  
    glGenVertexArrays(1,&vaoHandle);  
    glBindVertexArray(vaoHandle);  
  
    glEnableVertexAttribArray(0);//顶点坐标  
    glEnableVertexAttribArray(1);//顶点颜色  
  
    //调用glVertexAttribPointer之前需要进行绑定操作  
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);  
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, NULL );  
  
    glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);  
    glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, NULL );  
}  
  
void init()  
{  
    //初始化glew扩展库  
    glewInit();  
    
  
    initShader();
  
    initVBO();  
  
    glClearColor(0.0,0.0,0.0,0.0);  
    //glShadeModel(GL_SMOOTH);  
  
}  
  

void display()  
{  
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_TEST);  
  
    绘制一个三角形(使用普通方法)  
    //glBegin(GL_TRIANGLES);  
    //glColor3f(0.0f,1.0f,0.0f);  
    //glVertex3f(0.0f,1.0f,0.0f);  
  
    //glColor3f(0.0f,1.0f,0.0f);  
    //glVertex3f(-1.0f,-1.0f,0.0f);  
  
    //glColor3f(0.0f,0.0f,1.0f);  
    //glVertex3f(1.0f,-1.0f,0.0f);  
    //glEnd();  

	
  
    //使用VAO、VBO绘制  
    glBindVertexArray(vaoHandle);  
    glDrawArrays(GL_TRIANGLES,0,3);  
    glBindVertexArray(0);  

	//传递矩阵。
	matrixLocation= glGetUniformLocation(programHandle, "Matrix");
	glUniformMatrix4fv(matrixLocation, 1, GL_TRUE, matrix);
  
    glutSwapBuffers();  
	glutPostRedisplay();
}  
  


int main(int argc,char** argv)  
{  
    glutInit(&argc,argv);  
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
    glutInitWindowSize(600,600);  
    glutInitWindowPosition(100,100);  
    glutCreateWindow("GLSL Test : Draw a triangle");  
    init();  
    glutDisplayFunc(display);  
      
    glutMainLoop();  
    return 0;  
}  
使用的库可至我的资源页下载!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GLSL(OpenGL Shading Language)着色器是一种编程语言,用于定义在图形渲染管道中执行的图形着色和计算操作。它是基于C语言的,并且专门用于编写图形处理单元(GPU)的程序。GLSL着色器可以用于控制光照、纹理映射、阴影效果等,以实现各种复杂的图形效果。 Cesium是一个用于创建基于Web的地球和地理应用程序的JavaScript库。它提供了强大的地理功能和可视化效果,可以在Web浏览器中实现高质量的地球模拟和地理数据可视化。Cesium使用GLSL着色器来处理地图、地形和其他元素的渲染。通过修改着色器代码,我们可以自定义图层的着色器,达到我们想要的图层风格和效果。在Cesium中,可以通过访问着色器源代码并进行相应的修改来实现这一目的。 引用的内容说明了如何在Cesium中修改图层的着色器代码,从而实现自定义的图层效果。通过获取图层对应的片源着色器源代码,并使用字符串的replace函数来替换其中的代码,我们可以修改GLSL着色器代码,达到我们想要的效果。这样,我们就可以自定义图层的渲染样式和效果,使其符合我们的需求。 总结起来,GLSL着色器是一种用于定义图形渲染操作的编程语言,而Cesium是一个基于Web的地球和地理应用程序的JavaScript库,它使用GLSL着色器来处理地图和地理元素的渲染。通过修改着色器代码,我们可以自定义图层的着色器,实现自定义的图层效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值