我要发帖 回复

中级会员

35

主题

519

积分

0

专家分

:

私信
发表时间 : 2007-11-25 14:53:33 | 浏览 : 2864    评论 : 4
来源于http://hi.baidu.com/lzrspace/blo ... 6a842b6159f339.html
和红皮书中示例程序blendqn.c对照


//方法一:使用glext

#include <iostream>

#include <windows.h>

#include <GL/glut.h>

#include <GL/glext.h>

using namespace std ;

PFNGLBLENDEQUATIONPROC glBlendEquation = NULL;//定义函数指针

void init(void)

{

         glClearColor(1.0, 1.0, 0.0, 0.0) ;

         glBlendFunc(GL_ONE, GL_ONE) ;

         glEnable(GL_BLEND) ;

}

void display(void)

{

         glClear(GL_COLOR_BUFFER_BIT) ;

         glColor3f(0.0, 0.0, 1.0) ;

         glRectf(-0.5, -0.5, 0.5, 0.5) ;

         glFlush() ;

}

void reshape(int w, int h)

{

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

         glMatrixMode(GL_PROJECTION) ;

         glLoadIdentity() ;

         if(w<=h)

                   glOrtho(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,

                   1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0) ;

         else

                   glOrtho(-1.5*(GLfloat)w/(GLfloat)h,

                   1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0) ;

         glMatrixMode(GL_MODELVIEW) ;

         glLoadIdentity() ;

}

void keyboard(unsigned char key, int x, int y)

{

         PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");

         switch(key)

         {

                  

         case 'a':

         case 'A':

                   glBlendEquation(GL_FUNC_ADD) ;

                   break ;

         case 's':

         case 'S':

                   glBlendEquation(GL_FUNC_SUBTRACT) ;

                   break ;

         case 'r':

         case 'R':

                   glBlendEquation(GL_FUNC_REVERSE_SUBTRACT) ;

         case 'm':

         case 'M':

                   glBlendEquation(GL_MIN) ;

                   break ;

         case 'x':

         case 'X':

                   glBlendEquation(GL_MAX) ;

                   break ;

         case 27:

                   exit(0) ;

                   break ;

         }

         glutPostRedisplay() ;

}

int main(int argc, char **argv)

{

         

         glutInit(&argc, argv) ;

         glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;

         glutInitWindowSize(200, 200) ;

         glutCreateWindow("Blend") ;

         init() ;

         glutReshapeFunc(reshape) ;

         glutKeyboardFunc(keyboard) ;

         glutDisplayFunc(display) ;

         glutMainLoop() ;

         return 0 ;

}

//方法二:使用glew

#include <iostream>

#include <windows.h>

#include <GL/glew.h>

#include <GL/glut.h>

using namespace std ;


void init(void)

{

         glClearColor(1.0, 1.0, 0.0, 0.0) ;

         glBlendFunc(GL_ONE, GL_ONE) ;

         glEnable(GL_BLEND) ;

}

void display(void)

{

         glClear(GL_COLOR_BUFFER_BIT) ;

         glColor3f(0.0, 0.0, 1.0) ;

         glRectf(-0.5, -0.5, 0.5, 0.5) ;

         glFlush() ;

}

void reshape(int w, int h)

{

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

         glMatrixMode(GL_PROJECTION) ;

         glLoadIdentity() ;

         if(w<=h)

                   glOrtho(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,

                   1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0) ;

         else

                   glOrtho(-1.5*(GLfloat)w/(GLfloat)h,

                   1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0) ;

         glMatrixMode(GL_MODELVIEW) ;

         glLoadIdentity() ;

}

void keyboard(unsigned char key, int x, int y)

{

         switch(key)

         {

         case 'a':

         case 'A':

                   //Note: glBlendEquation is a subset of GL_ARB_imaging, please call glGetString

                   //first to confirm whether your video card support this extension.

                   glBlendEquation(GL_FUNC_ADD) ;

                   break ;

         case 's':

         case 'S':

                   glBlendEquation(GL_FUNC_SUBTRACT) ;

                   break ;

         case 'r':

         case 'R':

                   glBlendEquation(GL_FUNC_REVERSE_SUBTRACT) ;

         case 'm':

         case 'M':

                   glBlendEquation(GL_MIN) ;

                   break ;

         case 'x':

         case 'X':

                   glBlendEquation(GL_MAX) ;

                   break ;

         case 27:

                   exit(0) ;

                   break ;

         }

         glutPostRedisplay() ;

}

int main(int argc, char **argv)

{

         

         glutInit(&argc, argv) ;

         glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;

         glutInitWindowSize(200, 200) ;

         glutCreateWindow("Blend") ;

         

         GLenum err = glewInit();

         if (GLEW_OK != err)

         {

                   MessageBoxA(NULL, "error", "My Window", 1) ;

         }

         //if the return value contains "GL_ARB_imaging " then you can use glBlendEquation

         const GLubyte *str = glGetString(GL_EXTENSIONS) ;

         cout << str << endl ;

         init() ;

         glutReshapeFunc(reshape) ;

         glutKeyboardFunc(keyboard) ;

         glutDisplayFunc(display) ;

         glutMainLoop() ;

         return 0 ;

}

[ 本帖最后由 鹤舞流云 于 2007-11-25 03:10 PM 编辑 ]

最近VR访客

tan_dunming 评论于2007-11-25 16:21:04
长见识了,没想到glBlendEquation有这么多可选配置!

对了 方法二最好在程序中添加一下一句
#pragma comment( lib, "glew32.lib")
或者在工程中把glew32.lib添加进去。否则编译不通过。

方法一类似。

最近感觉纹理太重要了,参数也很值得好好研究一番。

[ 本帖最后由 tan_dunming 于 2007-11-25 04:22 PM 编辑 ]
追求卓越
force8008 评论于2007-11-25 18:05:32
呵呵,gl的功能还是很强大的
xinchao1230 评论于2008-3-31 20:25:55
以后再学习,现在还看不太懂
ldxjinian 评论于2008-4-2 10:25:44
刚刚开始学~

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-9-17 11:23 PM

返回顶部