OpenGL之再向虎山行[1]:重学OpenGL

要说图形学,不是不懂,而是没有系统的学习与复习,所以至今还属于半吊子,随便写些东西,也必须有书在侧。

再向虎山行,就是想在今年之内圆了梦想,能够有些东西出来。

>> OpenGL Diagnosis Tool

做WebService开发时,感觉抓包工具益处良多,所以图形开发也从diagnosis工具开始,这次居然很快就有了功效:

在一个glDrawRangeElements联系中,居然编译不过,借助于OpenGL Extensions Viewer与Dependency Viewer,原来Windows下根本就不支持。

http://www.realtech-vr.com/glview/

比较NB的是,这家伙在Apple AppStore与Mac AppStore上也有。

可以看到,并不支持OpenGL函数 glDrawRangeElements,用Dependency Walker查看可以印证:

其实还有什么gDEBugger 之类的,那也太高级了。

>> 查询OpenGL Information方法

void queryGlInfomationGLInfo(HDC hdc)
{
char* str = 0;
 
int colorBits[4]; // (r,g,b,a)
int depthBits;
int stencilBits;
int maxTextureSize;
int maxLights;
int maxAttribStacks;
int maxModelViewStacks;
int maxProjectionStacks;
int maxClipPlanes;
int maxTextureStacks;
int pixelFormat;

// get vendor string
str = (char*)glGetString(GL_VENDOR);

// get renderer string
str = (char*)glGetString(GL_RENDERER);

// get version string
str = (char*)glGetString(GL_VERSION);

// get all extensions as a string
str = (char*)glGetString(GL_EXTENSIONS);

// get number of color bits
glGetIntegerv(GL_RED_BITS, &colorBits[0]);
glGetIntegerv(GL_GREEN_BITS,
&colorBits[1]);
glGetIntegerv(GL_BLUE_BITS,
&colorBits[2]);
glGetIntegerv(GL_ALPHA_BITS,
&colorBits[3]);

// get depth bits
glGetIntegerv(GL_DEPTH_BITS, &depthBits);

// get stecil bits
glGetIntegerv(GL_STENCIL_BITS, &stencilBits);

// get max number of lights allowed
glGetIntegerv(GL_MAX_LIGHTS, &maxLights);

// get max texture resolution
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

// get max number of clipping planes
glGetIntegerv(GL_MAX_CLIP_PLANES, &maxClipPlanes);

// get max modelview and projection matrix stacks
glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &maxModelViewStacks);
glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH,
&maxProjectionStacks);
glGetIntegerv(GL_MAX_ATTRIB_STACK_DEPTH,
&AttribStacks);

// get max texture stacks
glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &info.maxTextureStacks);

// get the current pixel format
pixelFormat = GetPixelFormat(hdc);
}


>> 跨平台OpenGL Library

一个glDrawRangeElement的缺失,着实让我学的一个封装良好的OpenGL库很有用处,Google了一把,发现了glext, glew这类东西。

还是以glew中的glDrawRangeElements为例:

// Header

// States
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008

//
Function Pointer
typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)

GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;

// Implementation:
PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL;
glDrawRangeElements
= (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements"))


这样一来,就可以直接用glDrawRangeElements,当然了,前提还是要有glDrawRangeElements这个函数导出啊,否则巧妇也难为无米之炊。

其实,A公司的O库,也有这么一套玩意儿。

>> GLUT

http://www.xmission.com/~nate/glut.html

posted on 2011-09-20 07:53  飘行天下  阅读(1083)  评论(0编辑  收藏  举报

导航