GLSL 第一个代码

参考自http://hi.baidu.com/aawweeffaa/blog/item/313c0c2e568301301f3089bc.html

 

 

第一步:在glsl.cpp的同级目录里,新建二个文本文件

第一个取名first.vert,在里面编写顶点着色器,代码如下:

 

void main()

{

     gl_Position     = ftransform();

}

第二个取名first.frag,在里面编写片元着色器,代码如下:

 

void main()

{

    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);

}

 

 

 

以上两个是最简单的着色器代码,把片元设成黄色

第二步:将下面这段程序添加到上次新建好的glsl.cpp

 

 

 

//#include "stdafx.h"

 

//包含GLSL所需的头文件

 

#include <iostream>

#include <gl/glut.h>

#include <gl/glext.h>

 

 

 

 

 

static GLuint vertShader;   //顶点着色器对象

static GLuint fragShader;   //片元着色器对象

static GLuint glslProgram;   //程序对象

 

PFNGLATTACHSHADERPROC glAttachShader;

PFNGLSHADERSOURCEPROC glShaderSource;

PFNGLCOMPILESHADERPROC glCompileShader;

PFNGLCREATEPROGRAMPROC glCreateProgram;

PFNGLCREATESHADERPROC glCreateShader;

PFNGLLINKPROGRAMPROC glLinkProgram;

PFNGLUSEPROGRAMPROC glUseProgram;

PFNGLGETSHADERIVPROC glGetShaderiv;

PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;

PFNGLGETPROGRAMIVPROC glGetProgramiv;

PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;

 

//读入着色器代码

int readShaderSource(GLuint shader, const char *file)

{

FILE *fp;

const GLchar *source;

GLsizei length;

int ret;

 

glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");

 

fp = fopen(file, "rb");

if (fp == NULL) {

perror(file);

return -1;

}

 

fseek(fp, 0L, SEEK_END);

length = ftell(fp);

 

source = (GLchar *)malloc(length);

if (source == NULL) {

fprintf(stderr, "Could not allocate read buffer./n");

return -1;

}

 

fseek(fp, 0L, SEEK_SET);

ret = fread((void *)source, 1, length, fp) != (size_t)length;

fclose(fp);

 

if (ret)

fprintf(stderr, "Could not read file: %s./n", file);

else

glShaderSource(shader, 1, &source, &length);

 

free((void *)source);

 

return ret;

}

 

//输出着色器LOG

void printShaderInfoLog(GLuint shader)

{

GLsizei bufSize;

GLchar *infoLog;

GLsizei length;

 

glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");

 

glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &bufSize);

if (bufSize > 0) {

infoLog = (GLchar *)malloc(bufSize);

if (infoLog != NULL) {

glGetShaderInfoLog(shader, bufSize, &length, infoLog);

printf("%s/n", infoLog);

free(infoLog);

}

else

printf("Could not allocate InfoLog buffer./n");

}

}

 

//输出程序LOG

void printProgramInfoLog(GLuint program)

{

GLsizei bufSize;

GLchar *infoLog;

GLsizei length;

 

glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");

 

glGetProgramiv(program, GL_INFO_LOG_LENGTH , &bufSize);

if (bufSize > 0) {  

infoLog = (GLchar *)malloc(bufSize);

if (infoLog != NULL) {   

glGetProgramInfoLog(program, bufSize, &length, infoLog);

printf("%s/n", infoLog);

free(infoLog);

}

else

printf("Could not allocate InfoLog buffer./n");

}

}

 

//初始化

 

void init(void)

{

glClearColor(0.0,0.0,0.0,0.0);

 

glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");

glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");

glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");

glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");

glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");

glGetShaderiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetShaderiv");

glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");

 

GLint compiled, linked;

 

//创建顶点着色器对象和片元着色器对象

vertShader = glCreateShader(GL_VERTEX_SHADER);

fragShader = glCreateShader(GL_FRAGMENT_SHADER);

 

//读入着色器代码

readShaderSource(vertShader, "first.vert");

readShaderSource(fragShader, "first.frag");

 

//编译顶点着色器

glCompileShader(vertShader);

glGetShaderiv(vertShader, GL_COMPILE_STATUS, &compiled);

printShaderInfoLog(vertShader);

if (compiled == GL_FALSE) {

printf("Compile error in vertex shader./n");

exit(1);

}

 

//编译片元着色器

glCompileShader(fragShader);

glGetShaderiv(fragShader, GL_COMPILE_STATUS, &compiled);

printShaderInfoLog(fragShader);

if (compiled == GL_FALSE) {

printf("Compile error in vertex shader./n");

exit(1);

}

 

//创建一个程序对象

glslProgram = glCreateProgram();

 

//将编译好的着色器捆绑到程序对象上

glAttachShader(glslProgram, vertShader);

glAttachShader(glslProgram, fragShader);

 

//连接程序对象

glLinkProgram(glslProgram);

glGetProgramiv(glslProgram, GL_LINK_STATUS, &linked);

printProgramInfoLog(glslProgram);

if (linked == GL_FALSE) {

printf("Link error./n");

exit(1);

}

 

//使用着色器

glUseProgram(glslProgram);

}

 

//物体描画

 

void display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glRectf(-25.0, -25.0, 25.0, 25.0);

glFlush();

}

 

void reshape(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

 

//主函数

 

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

glutInitWindowSize(250,250);

glutInitWindowPosition(100,100);

glutCreateWindow("GLSL");

init();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于WebGL渲染雷达图,您可以按照以下步骤进行: 1. 创建一个WebGL上下文,您可以使用canvas元素来创建WebGL上下文。例如: ```javascript var canvas = document.getElementById('canvas'); var gl = canvas.getContext('webgl'); ``` 2. 准备雷达图的数据。雷达图通常是由多个部分组成的,每个部分表示不同的数据维度。您需要将这些数据转换为网格形式,然后在WebGL中进行渲染。 3. 编写顶点着色器和片元着色器。顶点着色器负责将网格数据转换为屏幕坐标,片元着色器负责对每个像素进行着色。例如: ```glsl // 顶点着色器 attribute vec3 aPosition; uniform mat4 uModelViewProjectionMatrix; void main() { gl_Position = uModelViewProjectionMatrix * vec4(aPosition, 1.0); } // 片元着色器 precision mediump float; uniform vec4 uColor; void main() { gl_FragColor = uColor; } ``` 在这个例子中,顶点着色器接收一个名为aPosition的属性,表示网格数据中的每个顶点位置,然后将其转换为屏幕坐标。片元着色器接收一个名为uColor的uniform,表示每个像素的颜色。 4. 创建缓冲区并将网格数据上传到缓冲区中。例如: ```javascript var positionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); ``` 在这个例子中,我们创建了一个名为positionBuffer的缓冲区,将网格数据中的每个顶点位置上传到该缓冲区中。 5. 将缓冲区与顶点着色器中的属性进行关联。例如: ```javascript var positionAttributeLocation = gl.getAttribLocation(program, 'aPosition'); gl.enableVertexAttribArray(positionAttributeLocation); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0); ``` 在这个例子中,我们使用getAttribLocation函数获取顶点着色器中名为aPosition的属性的位置,然后使用enableVertexAttribArray函数启用该属性,并使用vertexAttribPointer函数将缓冲区与该属性进行关联。 6. 设置uniform变量的值。例如: ```javascript var colorUniformLocation = gl.getUniformLocation(program, 'uColor'); gl.uniform4f(colorUniformLocation, 1.0, 0.0, 0.0, 1.0); ``` 在这个例子中,我们使用getUniformLocation函数获取片元着色器中名为uColor的uniform的位置,然后使用uniform4f函数设置该uniform的值为红色。 7. 绘制网格。例如: ```javascript gl.drawArrays(gl.TRIANGLE_FAN, 0, positions.length / 3); ``` 在这个例子中,我们使用drawArrays函数绘制网格,第一个参数表示绘制的图元类型,第二个参数表示从缓冲区中的哪个位置开始绘制,第三个参数表示需要绘制的顶点数量。 这是一个简单的代码示例,您可以根据自己的需求进行修改和扩展。希望对您有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值