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   飘行天下  阅读(1084)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示