这段时间终于接触到一点点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. Python之路:Python各个器

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器 ...

  2. Publisher/Subscriber 订阅-发布模式

    Publisher/Subscriber 订阅-发布模式 本博后续将陆续整理这些年做的一些预研demo,及一些前沿技术的研究,与大家共研技术,共同进步. 关于发布订阅有很多种实现方式,下面主要介绍WC ...

  3. 部署一个class文件

    只发布一个class文件找到项目工作空间/target/class..根据项目结构找到修改的java文件编译的class文件比如RegexUtils.class使用SecureFXPortable将文 ...

  4. 如何配置和使用Tomcat访问日志

    配置位置在log下的server.xml,(tomcat容器) <Engine defaultHost="localhost" name="Catalina&quo ...

  5. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

  6. android错误之android.content.res.Resources$NotFoundException:

    错误:android.content.res.Resources$NotFoundException: String resource ID #0x1 原因:一般发生在参数 int resId 错误, ...

  7. 【Eclipse】修改项目访问名称

    Properties --> Web Project Settings --> Context root --> 输入想要用的名称(默认是项目名)

  8. 解决 Xcode7 中多个模拟器的办法

    转自: http://www.oschina.net/code/snippet_196012_50574 1.关闭xcode 2.终端输入 sudo killall -9 com.apple.Core ...

  9. 使用ActionBar实现Tab导航(快速生成Tab样式)

    效果如图: MainActivity.java具体实现: package com.rainmer.actionbartab; import android.app.ActionBar; import ...

  10. [转] iOS应用架构谈 网络层设计方案

    原文地址:http://casatwy.com/iosying-yong-jia-gou-tan-wang-luo-ceng-she-ji-fang-an.html iOS应用架构谈 开篇 iOS应用 ...