这段时间终于接触到一点点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. C陷阱与缺陷(三)

    第三章 语义陷阱 3.1 指针与数组 C语言中只有一维数组,而且数组的大小必须字编译期就作为一个常数确定下来.数组中的元素可以是另外一个数组.任何一个数组下标运算都等同于一个对应的指针运算.int a ...

  2. 推荐font-size的单位 % em单位

    在如今这个提倡可用性设计以及用户体验设计的网络时代,CSS也是要一同参与其中的.大部分人在CSS代码编写中总是先对整体定义字体尺寸,中文情况下一般为12px,而其实这样以来在通过IE顶部菜单中的“察看 ...

  3. 3644 - X-Plosives(水题,并差集)

    3644 - X-Plosives A secret service developed a new kind of explosive that attain its volatile proper ...

  4. iOS KVO & KVC

    键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性.该属性值改变时,会通知观察对象.它了解新值以及旧值:如果观察的属性为对多的 ...

  5. FragmentPagerAdapter刷新fragment最完美解决方案

    FragmentPagerAdapter刷新fragment最完美解决方案   先感谢kingjxl2006的博客文章<Android FragmentPagerAdapter数据刷新notif ...

  6. android Graphics(四):canvas变换与操作

    前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...

  7. CodeForces 525C Ilya and Sticks 贪心

    题目:click here #include <iostream> #include <cstdio> #include <cstring> #include &l ...

  8. linux嵌入式: 实现自己的tree命令

    //# cat treecmd.c #include<stdio.h> #include<dirent.h> #include<sys/stat.h> #inclu ...

  9. [Swust OJ 603]--吃饺子大王

      题目链接:http://acm.swust.edu.cn/problem/603/ Time limit(ms): 1000 Memory limit(kb): 65535   同学们还记得我们班 ...

  10. libev源代码浅析

    libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施.其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理. libev的基本使用方法 ...