拿出来直接运行即可,可以直接理解什么是GLSL,之所以贴出来是因为很多文章写得乱七八糟,一面解释,一面贴代码,有必要吗??很多GLSL电子书都有很详细的解释的。
我的OpenGL框架代码可能和你的框架的有些不同,可以把init、update、draw实现拿出来即可。
 
vertexshader.txt

uniform vec3 lightposition;//光源位置 
uniform vec3 eyeposition;//相机位置 
uniform vec4 ambient;//环境光颜色 
uniform vec4 lightcolor;//光源颜色 
uniform float Ns;//高光系数 
uniform float attenuation;//光线的衰减系数

varying vec4 color;//向片段着色其传递的参数

void main() 
{
/*很多示例中都是利用uniform参数从应用程序中向shader里传递当前模型视图矩阵和模型视图投影矩阵,其实对于初学者来说,我们大可以先用GLSL的内建变量:gl_ModelViewMatrix和gl_ModelViewProjectionMatrix代替,而顶点坐标的变换则直接可以利用内建函数ftransform()实现。当然,如果你想自己传递这些参数也是可以的,后面会介绍一下。而gl_Vertex和gl_Normal则分别表示当前传入的顶点的物体坐标系坐标和表面法向量,gl_Position则是用来传输投影坐标系内顶点坐标的内建变量。注意内建变量是不用声明的,直接使用就行*/  
vec3 ECPosition = vec3(gl_ModelViewMatrix * gl_Vertex); 
vec3 N = normalize(gl_NormalMatrix * gl_Normal); 
vec3 L = normalize(lightposition - ECPosition); 
vec3 V = normalize(eyeposition - ECPosition); 
vec3 H = normalize(V + L);

vec3 diffuse = lightcolor * max(dot(N , L) , 0); 
vec3 specular = lightcolor * pow(max(dot(N , H) , 0) , Ns) * attenuation;

color = vec4(clamp((diffuse + specular) , 0.0 , 1.0) , 1.0); 
color = color + ambient;

gl_Position = ftransform(); 
}

 
 
fragmentshader.txt

//这里的的varying变量名称要与顶点着色器里的一样,否则会编译错误 
varying vec4 color;

void main() 

//gl_FragColor是输出片段颜色的内建变量,凡是以gl_开头的变量都是内建变量
gl_FragColor = color;

}
 
 
 
OpenGL代码:
头文件如下:
#pragma once
#include "GLFrame.h"
#include <gl\glew.h>
#include <gl\gl.h>
#include <gl\GLUT.H>
#include <cmath>
#include <iostream>

#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"glew32.lib")
class CGraphics:GLApplication
{
public:
     ~CGraphics(void);
     bool Init();
     void Update(DWORD milliseconds);
     void Uninit();
     void Draw();
     CGraphics(const char * class_name, const char* form_title);

GLchar* readShaderSource(const char* filename);
     int     installShaders(const GLchar *Vertex,const GLchar *Fragment);

float m_angle;
private:
     friend class GLApplication;
};

 
实现文件.cpp:
#include "Graphics.h"
#include <gl\gl.h>                                                            /**< 包含OpenGL头文件 */
#include <gl\glu.h>                                                            
#include <gl\glaux.h>

GLfloat ambient[4] = {1.0 , 0.0 , 0.0 , 1.0}; 
GLfloat lightcolor[4] = {1.0 , 1.0 , 1.0 , 1.0}; 
GLfloat eyeposition[3] = {0.0 , 10.0 , 30.0}; 
GLfloat skycolor[3] = {0.7 , 0.7 , 1.0}; 
GLfloat groundcolor[3] = {0.2 , 0.2 , 0.2}; 
GLfloat Ns = 8; 
GLfloat attenuation = 0.1; 
GLfloat objectSize = 15.0; 
GLuint program; 
GLuint vShader , fShader;

GLApplication * GLApplication::Create(const char * class_name)
{
     CGraphics * example = new CGraphics(class_name, "小练习-GLSL");
     return reinterpret_cast<GLApplication *>(example);
}

CGraphics::~CGraphics(void)
{
}

CGraphics::CGraphics(const char * class_name,const char* form_title):GLApplication(class_name,form_title)
{
     m_angle=0.0f;
}

bool CGraphics::Init()
{
     glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                              
     glClearDepth(1.0f);                                                       
     glDepthFunc(GL_LEQUAL);                                                  
     glEnable(GL_DEPTH_TEST);                                             
     glShadeModel(GL_SMOOTH);                                             
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

#pragma region 初始化glew
     GLenum err=glewInit();
     if(err!=GLEW_OK)
          MessageBox(NULL,"failed to init glew!","提示",MB_OK);
#pragma endregion

#pragma region 读取顶点着色器和片源着色器源程序
     const GLchar *vShaderSource = readShaderSource("vertexshader.txt"); 
     const GLchar *fShaderSource = readShaderSource("fragmentshader.txt"); 
#pragma endregion

installShaders(vShaderSource,fShaderSource);
     return true;
}

GLchar* CGraphics::readShaderSource(const char* filename)
{
     GLchar *shader;
     FILE *fp;
     fp=fopen(filename,"rt+");
     if(!fp)
          MessageBox(NULL,"error","提示",MB_OK);
#pragma region 获取文件长度
     rewind(fp);
     fseek(fp,0,SEEK_END);
     int len=ftell(fp);//返回当前文件指针的位置
#pragma endregion
     rewind(fp); //回到文件开头
     fseek(fp,0,SEEK_SET);
     shader=(GLchar*)malloc(sizeof(char)*(len+1));
     memset(shader,0,len+1);
     fread(shader,sizeof(char),len,fp);
     fclose(fp);
     return shader;
}

int CGraphics::installShaders(const GLchar *Vertex, const GLchar *Fragment)
{
    GLint vertCompiled, fragCompiled;    // status values
    GLint linked;
    // Create a vertex shader object and a fragment shader object
    vShader = glCreateShader(GL_VERTEX_SHADER);
    fShader = glCreateShader(GL_FRAGMENT_SHADER);

// Load source code strings into shaders
    glShaderSource(vShader, 1, (const char **)&Vertex, NULL);
    glShaderSource(fShader, 1, (const char **)&Fragment, NULL);

// Compile the brick vertex shader, and print out
    // the compiler log file.
    glCompileShader(vShader);
    glGetShaderiv(vShader, GL_COMPILE_STATUS, &vertCompiled);

// Compile the brick vertex shader, and print out
    // the compiler log file.
    glCompileShader(fShader);
    glGetShaderiv(fShader, GL_COMPILE_STATUS, &fragCompiled);

if (!vertCompiled || !fragCompiled)
         MessageBox(NULL,"error","提示",MB_OK);

// Create a program object and attach the two compiled shaders
    program = glCreateProgram();
    glAttachShader(program, vShader);
    glAttachShader(program, fShader);

// Link the program object and print out the info log
    glLinkProgram(program);

glGetProgramiv(program, GL_LINK_STATUS, &linked);
    if (!linked)
        MessageBox(NULL,"error","提示",MB_OK);

#pragma region 编译信息,警告或错误(可以注释掉)
    int infologlength;
    int charswrriten;
    char *infolog;
     // Install program object as part of current state
    glGetShaderiv(vShader,GL_INFO_LOG_LENGTH,&infologlength);
    infolog=(char*)malloc(infologlength);
    glGetShaderInfoLog(vShader,infologlength,&charswrriten,infolog);
    MessageBox(NULL,infolog,"提示",MB_OK);
    glGetShaderiv(fShader,GL_INFO_LOG_LENGTH,&infologlength);
    infolog=(char*)malloc(infologlength);
    glGetShaderInfoLog(fShader,infologlength,&charswrriten,infolog);
    MessageBox(NULL,infolog,"提示",MB_OK);
#pragma endregion
   //以上的代码被注释起来,作用是获得shader编译后的错误报告,用于调试,由于已经调试成功,这里就不需要这些代码了
    return 1;
}

void CGraphics::Draw()
{
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();
     
     /*这里是程序比较重要的地方:向给shader中的uniform变量赋值。注意赋值函数使用的位置,只有当一个program启用的时候,里面的uniform变量才会被分配索引,所以过早的对uniform变量赋值会长生错误。同时注意函数的格式*/ 
     glUseProgram(program); 
     glUniform3f(glGetUniformLocation(program , "lightposition") , 30.0 , 30.0 , 30.0); 
     glUniform3f(glGetUniformLocation(program , "eyeposition") , eyeposition[0] , eyeposition[1] , eyeposition[2]); 
     glUniform4f(glGetUniformLocation(program , "ambient") , ambient[0] , ambient[1] , ambient[2] , ambient[3]); 
     glUniform4f(glGetUniformLocation(program , "lightcolor") , lightcolor[0] , lightcolor[1] , lightcolor[2] , lightcolor[3]); 
     glUniform1f(glGetUniformLocation(program , "Ns") , Ns); 
     glUniform1f(glGetUniformLocation(program , "attenuation") , attenuation); 
     /*刚开始我以为要利用shader进行渲染就要必须将模型变为一个一个顶点信息向shader中传入,但其实并不是这样,我们同样可以利用glut的内建模型或者自己动手载入模型,和平时一样。同时注意一点,glut的一些内建模型只包含平面法线,没有纹理坐标,所以在后面我们给模型添加纹理的时候有些就无法显示出纹理*/ 
     glPushMatrix();
          glTranslatef(0.0f,0.0f,-50.0f);
          glRotated(m_angle,0.0f,1.0f,0.0f);
          glutSolidTeapot(objectSize);
     glPopMatrix();
}

void CGraphics::Uninit()
{

}

void CGraphics::Update(DWORD milliseconds)
{
     m_angle=m_angle+0.5f;
     if (m_angle>=1440.0f)
     {
          m_angle=0.0f;
     }
}

GLSL第一个程序的更多相关文章

  1. Android开发-之第一个程序:HelloWorld!

    小编觉得不管学习什么编程的时候,第一个程序都是要求打印输出一个"HelloWorld!",那就从最简单的HelloWorld开始吧!哈哈~~~~ 一.创建一个Android工程 1 ...

  2. [Fluent NHibernate]第一个程序

    目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...

  3. rails再体验(第一个程序)

    掌握redmine plugin开发的目标在2016年未实现,2017年继续. 选择<Ruby on Rails Tutorial>教程,windows安装railsinstaller,该 ...

  4. OpenGL学习笔记1——第一个程序

    学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...

  5. Android 第一个程序 及 环境搭配

    一. JDK配置 1.找到jdk安装路径 2.配置环境变量(建议配置在系统变量里面) 1).配置JAVA_HOME变量 2).配置 CLASSPATH 环境变量 CLASSPATH=.;%JAVA_H ...

  6. unix 网路编程(卷一)第一个程序编译过程

    unix卷一去年暑假买的到现在才开始看无比惭愧,而且惭愧第一个程序就断断续续弄了几天,要好好写程序了,马上要找工作了,下面介绍下把本书第一个程序跑起来的过程: 搜各种博客 我用系统的是ubuntu 1 ...

  7. Hadoop学习历程(三、第一个程序)

    根据之前的操作,我们已经可以正常的启动Hadoop了,关于真正的集群我会在之后进行说明.现在我们来看一下第一个程序吧 1. 在eclipse上建立一个java项目 2. 将 /usr/hadoop/s ...

  8. Python2.7.3 学习——第一个程序 Hello Python World

    Hello World 每学一门语言开始的第一程序都是Hello World ,当然了Python也不例外,下面开始我们的Python第一个程序编写: 1,命令行: (1)打开终端,输入python, ...

  9. 【 D3.js 入门系列 — 1 】 第一个程序 HelloWorld

    记得以前刚上大一学 C 语言的时候,写的第一个程序就是在控制台上输出 HelloWorld .当时很纳闷,为什么要输出这个.老师解释说所有学编程入门的第一个程序都是在屏幕上输出 HelloWorld, ...

随机推荐

  1. Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理

    通过socket获取字节流处理时最初使用的是BufferedReader和PrintWriter  这种方式在解析字符串时是比较方便的 但是在处理字节时不够方便最终还是回归到InputStream和O ...

  2. JS控制flash的播放

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  3. android 打开软件出现红框

    android打开软件的时候会出现红框,剑锋之前解了这个问题.fork过来,方便以后查看. 参考链接: http://www.cnblogs.com/zengjfgit/p/5377744.html ...

  4. iOS Auto Layout

    Auto Layout是什么 Auto Layout是一个基于constraint(约束)的布局系统,它根据UI元素之间约束关系来调整UI元素的位置和大小. Auto Layout解决什么问题 更容易 ...

  5. Java私有构造函数不能阻止继承

    下面是一个调用已经私有化的单列的函数的列子. 这里用了静态内部类,关键就是静态内部类可以访问外部类的私有构造函数. 这种算是变种继承吧.前提是可以在原来的单列类里添加代码. class Single ...

  6. docker-compose常用命令

    --verbose:输出详细信息-f 制定一个非docker-compose.yml命名的yaml文件-p 设置一个项目名称(默认是directory名)docker-compose的动作包括:bui ...

  7. 脚本编程中的test、bash调试、变量计算、参数

    脚本编程中的test.bash调试.变量计算.参数 1.文件测试 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试路径是否为目录 -r FILE:测试当前 ...

  8. 01 viewport

    <meta name="viewport" content="width=device-width,initial-scale=1.0">

  9. mysql:on duplicate key update与replace into

    在往表里面插入数据的时候,经常需要:a.先判断数据是否存在于库里面:b.不存在则插入:c.存在则更新 一.replace into 前提:数据库里面必须有主键或唯一索引,不然replace into ...

  10. 多语言本地化开发Localized

    NSString * ViewsLocalizedStringFormat(NSString *key,NSString *defValue); // Handle localized strings ...