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