这段时间终于接触到一点点shader了,应该说shader是非常有用的东西吧,它就是能够把一些固定渲染管线的东西改变了,按照自己的意愿进行渲染,这样的话图形就可以自由发挥了。

我也只是试验了一下shader,然后有一些经验:

一、windows上面的gl版本只有1.1,永远只有1.1,微软太万恶了。。

1.1没有GLSL,不能写shader,,,,,,

所以要用一个开源的库,叫glew,用它才能在windows上写shader。。

蛋疼的微软。。。

二、glew使用之前要初始化,glewinit。

而且要在创建窗口之后初始化,

初始化之后才能用,才能写shader

下面是我试验了一下shader能不能用,只是试验这个东西好不好使,可以跑起来的:

#include <windows.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
#include <string>
#include <cstdio>
using namespace std ; void init() ;
void display() ;
void reshape( int , int ) ;
void makeShader() ; int main( int argc , char ** argv )
{
//glewInit() ;
glutInit( &argc , argv ) ;
glutInitWindowSize( 500 , 500 ) ;
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE ) ;
glutCreateWindow( "cube" ) ;
glewInit() ;
makeShader() ;
init() ;
glutDisplayFunc( display ) ;
glutReshapeFunc( reshape ) ;
glutMainLoop() ;
return 0 ;
} void makeShader()
{
int shader , program , compiled , linked ; const GLchar* shaderSrc[] = {
"void main()"
"{"
" gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex ; "
"}"
} ;
shader = glCreateShader( GL_VERTEX_SHADER ) ;
glShaderSource( shader , 1 , shaderSrc , NULL ) ;
glCompileShader( shader ) ; glGetShaderiv( shader , GL_COMPILE_STATUS , &compiled) ; if( !compiled )
{
GLint Length ;
GLchar *log ;
glGetShaderiv( shader , GL_INFO_LOG_LENGTH , &Length ) ;
log = (GLchar*)malloc( Length ) ;
glGetShaderInfoLog( shader , Length , &Length , log ) ;
fprintf( stderr , "compile log = '%s '\n" , log ) ;
free( log ) ;
} program = glCreateProgram() ; glAttachShader( program , shader ) ;
glLinkProgram( program ) ; glGetProgramiv( program , GL_LINK_STATUS , &linked ) ;
if( linked )
{
glUseProgram( program ) ;
}
else
{
cout << "error" << endl ;
} } void init()
{
//makeShader() ;
glClearColor( 0 , 0 , 0 , 0 ) ;
glClear( GL_COLOR_BUFFER_BIT ) ;
} void reshape( int w , int h )
{
glViewport( 0 , 0 , w , h ) ;
glMatrixMode( GL_PROJECTION ) ;
glLoadIdentity() ;
glFrustum( -1 , 1 , -1 , 1 , 1 , 5 ) ;
glMatrixMode( GL_MODELVIEW ) ;
glLoadIdentity() ;
} void display()
{
glColor3f( 1 , 1 , 0 ) ;
gluLookAt( 0 , 0 , 5 ,
0 , 0 , 0 ,
0 , 1 , 0
) ;
glTranslatef( 1 , 0 , 0 ) ;
glRotatef( 30 , 0 , 0 , 1 ) ;
glutWireCube( 1 ) ;
glRotatef( -30 , 0 , 0 , 1 ) ;
glTranslatef( 1 , 0 , 0 ) ;
glBegin( GL_TRIANGLES ) ;
glVertex3f( 0 , 0 , 0 ) ;
glVertex3f( 0 , 0.5 , 0 ) ;
glVertex3f( 0.5 , 0.5 , 0 ) ;
glEnd() ;
glFlush() ;
}

opengl学习笔记(二)的更多相关文章

  1. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  2. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  3. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  4. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  10. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. Flask中全局变量的实现

    我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...

  2. HTML+CSS笔记 表格,超链接,图片,表单

    表格 给表格加入CSS样式,添加表格边框 语法: <style type="text/css"> table tr td,th{border:1px solid #00 ...

  3. fedora21安装无线驱动

    来源:http://www.2cto.com/os/201202/120249.html 一.导入rpmfushion源,使用第三方yum 源: su -c 'yum localinstall --n ...

  4. Python实现BBS自动登录并发帖

    初学Python有了一段时间,寒假里又看了一些Web编程方面的知识,就写了一个实现bbs自动登录和发帖的Python脚本 由于本人学校BBS站首页使用js加载,貌似通过首页登录不大可行,然后就分析表单 ...

  5. Codeforces Round #198 (Div. 2) 340C

    C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  6. 【转载】Java重构示例【1】

    序言 本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考.精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展.程序员阅读精致的代码如同大众欣赏 ...

  7. c++特殊函数

    C++中NULL不能写作小写,NULL的值为零,也可以写作0 在自己写的复制构造函数中不改变原对象,所以传进来的参数可以设为const类型的,这样可以保证传进来的对象不被改变 比如A(const A ...

  8. 数矩形(N - 暴力求解、打表)

    数矩形 Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格.            Input 第一行输入一个t, 表示有t组数据,然后 ...

  9. ViewPager实现启动引导页面(个人认为很详细)

    效果如图: 启动页面是一张图片+延时效果,这里就不给出布局文件了. WelcomeActivity分析:在启动页面检测是否是第一次运行程序,如果是,则先跳转到引导界面的Activity——AndyVi ...

  10. php定时输出

    //PHP定时输出 ob_end_flush(); //关闭输出缓冲 set_time_limit(0); //设置最大执行时间为无限制 echo '============开始=========== ...