主题:[原创]OpenGL入门学习——第十六课
eastcowboy
[专家分:25370] 发布于 2008-05-05 14:24:00
现在即将放出的是第十六课的内容。
首先还是以前课程的连接:
[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=185032]第四课,颜色的选择[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196017]第五课,三维的空间变换[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196231]第六课,动画的制作[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=218828]第七课,使用光照来表现立体感[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=219518]第八课,使用显示列表[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=224877]第九课,使用混合来实现半透明效果[/url]
[url=http://www.programfan.com/club/post-227694.html]第十课,BMP文件与像素操作[/url]
[url=http://www.programfan.com/club/post-244703.html]第十一课,纹理的使用入门[/url]
[url=http://bbs.pfan.cn/post-252901.html]第十二课,OpenGL片断测试[/url]
[url=http://bbs.pfan.cn/post-275218.html]第十三课,OpenGL是一个状态机[/url]
[url=http://bbs.pfan.cn/post-275219.html]第十四课,OpenGL版本和OpenGL扩展[/url]
[url=http://bbs.pfan.cn/post-275223.html]第十五课,从“绘制一个立方体”来看OpenGL的进化过程[/url]
第十六课,在Windows系统中显示文字 ——→ [color=0000FF]本次课程的内容[/color]
内容超多的一课!不过我想精彩的程度也一定不会让大家失望。大家不妨先浏览一下课程里的图片:)。
[color=FF0000]2008-06-10 修改了附件[/color]
增加了两个文件,showline.c, showtext.c。分别为第二个和第三个示例程序的main函数相关部分。
在ctbuf.h和textarea.h最开头部分增加了一句#include <stdlib.h>
附件中一共有三个示例程序:
第一个,飘动的“曹”字旗。代码为:flag.c, GLee.c, GLee.h
第二个,带缓冲的显示文字。代码为:showline.c, ctbuf.c, ctbuf.h, GLee.c, GLee.h
第三个,显示歌词。代码为:showtext.c, ctbuf.c, ctbuf.h, textarea.c, textarea.h, GLee.c, GLee.h
其中,GLee.h和GLee.c可以[url=http://www.opengl.org/sdk/libs/GLee/GLee5_21.zip]从网上下载[/url],因此这里并没有放到附件中。在编译的时候应该将这两个文件和其它代码文件一起编译。
=====================未完,请勿跟帖=====================
最后更新于:2008-06-10 15:57:00
回复列表 (共106个回复)
81 楼
mark_huang [专家分:0] 发布于 2010-08-06 16:22:00
如此好的东西,一定要好好学习、好好理解,力争能向楼主一样为社会,为人民做贡献!
82 楼
biao060798 [专家分:0] 发布于 2010-08-07 17:03:00
[em1]顶!就是下载不了啊???~~~~(>_<)~~~~ 郁闷ing!
83 楼
eastcowboy [专家分:25370] 发布于 2010-08-07 17:09:00
[quote]顶!就是下载不了啊???~~~~(>_<)~~~~ 郁闷ing![/quote]
顶楼的附件是可以成功下载的啊。我刚才用迅雷试过了,下载成功。
84 楼
ganzw [专家分:0] 发布于 2010-09-12 15:36:00
看完了您的十六章课程感觉很不错!谢谢您的勤劳付出!!
请问还有没有新的课程??
非常期待...!
85 楼
chuntian_1 [专家分:0] 发布于 2010-11-01 15:58:00
谢谢,刚看到这个帖子,这该是原帖,非常有帮助。
楼主还发了OpenGL的帖子没有,如有请帖上网址,
再次感谢楼主。
86 楼
BIKETO [专家分:0] 发布于 2010-11-15 16:53:00
从1到16帖都看过了,非常感谢楼主,特意注册个帐号支持哈
87 楼
chuntian_1 [专家分:0] 发布于 2010-11-29 23:51:00
楼主有没有作过《opengl编程指南》中的,primrestart.c这个程序,
怎么也通过不了,楼主要是作过,给上传一份源码,多谢楼主了。
真的搞不懂,看入门书的都是初学者,不给编译好源码。
88 楼
eastcowboy [专家分:25370] 发布于 2010-11-30 19:46:00
[quote]楼主有没有作过《opengl编程指南》中的,primrestart.c这个程序,
怎么也通过不了,楼主要是作过,给上传一份源码,多谢楼主了。
真的搞不懂,看入门书的都是初学者,不给编译好源码。[/quote]
不知你是否可以提供更多的信息?如果是编译错误的话,可以把错误信息贴出来。
另:VC系列的编译器,虽然自带了gl.h这个头文件,但那是OpenGL 1.1版本的,后面版本新增的函数都无法直接调用。关于这个问题,你可以看看本教程第十四课。第九楼介绍了一个小工具,GLEE,利用它可以在VC(或者其它一些平台)中方便的调用更高版本的OpenGL函数。当然了,这个细节其实是VC和Windows的细节,而不是OpenGL本身的问题。如果楼主用苹果电脑的话,它的开发环境默认都是OpenGL 2.1版本,这样就可以直接编译通过了。
89 楼
cfj469933485 [专家分:950] 发布于 2010-11-30 21:38:00
OpenGL不知道是什么东西。惭愧,虚心学习中。。。
90 楼
chuntian_1 [专家分:0] 发布于 2010-12-02 20:08:00
[/quote]不知你是否可以提供更多的信息?如果是编译错误的话,可以把错误信息贴出来。
另:VC系列的编译器,虽然自带了gl.h这个头文件,但那是OpenGL 1.1版本的,后面版本新增的函数都无法直接调用。关于这个问题,你可以看看本教程第十四课。第九楼介绍了一个小工具,GLEE,利用它可以在VC(或者其它一些平台)中方便的调用更高版本的OpenGL函数。当然了,这个细节其实是VC和Windows的细节,而不是OpenGL本身的问题。如果楼主用苹果电脑的话,它的开发环境默认都是OpenGL 2.1版本,这样就可以直接编译通过了。[/quote]
谢谢!用的是windows,vc,这是源码:
[code=c]
#define GL_GLEXT_PROTOTYPES
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <GL/freeglut.h>
#include <GL/glext.h>
#pragma comment(lib,"freeglut.lib")
#pragma comment(lib,"glut32.lib")
#define BUFFER_OFFSET(offset) (const GLvoid *)( NULL + offset)
#define XStart -0.8
#define XEnd 0.8
#define YStart -0.8
#define YEnd 0.8
#define NumXPoints 11
#define NumYPoints 11
#define NumPoints (NumXPoints * NumYPoints)
#define NumPointsPerStrip (2*NumXPoints)
#define NumStrips (NumYPoints-1)
#define RestartIndex 0xffff
const GLvoid * ptimb = NULL;
void init()
{
GLuint vbo, ebo;
GLfloat *vertices;
GLushort *indices;
/* Set up vertex data */
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 2*NumPoints*sizeof(GLfloat), NULL, GL_STATIC_DRAW);
vertices = (GLfloat *)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (vertices == NULL)
{
fprintf(stderr, "Unable to map vertex buffer\n");
exit(EXIT_FAILURE);
}
else
{
int i, j;
GLfloat dx = (GLfloat)(XEnd - XStart) / (NumXPoints - 1);
GLfloat dy = (GLfloat)(YEnd - YStart) / (NumYPoints - 1);
GLfloat *tmp = vertices;
int n = 0;
for (j = 0; j < NumYPoints; ++j)
{
GLfloat y = (GLfloat)(YStart + j*dy);
for (i = 0; i < NumXPoints; ++i)
{
GLfloat x = (GLfloat)(XStart + i*dx);
*tmp++ = x;
*tmp++ = y;
}
}
glUnmapBuffer(GL_ARRAY_BUFFER);
//glVertexPointer(2, GL_FLOAT, 0, ptimb);
glVertexPointer(2, GL_FLOAT, 0, BUFFER_OFFSET(0));
glEnableClientState(GL_VERTEX_ARRAY);
}
/* Set up index data */
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
/* We allocate an extra restart index because it simplifies
** the element-array loop logic */
glBufferData( GL_ELEMENT_ARRAY_BUFFER,
NumStrips*(NumPointsPerStrip+1)*sizeof(GLushort),
NULL, GL_STATIC_DRAW );
indices = (GLushort *)glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
if (indices == NULL)
{
fprintf(stderr, "Unable to map index buffer\n");
exit(EXIT_FAILURE);
}
else
{
int i, j;
GLushort *index = indices;
for (j = 0; j < NumStrips; ++j)
{
GLushort bottomRow = j*NumYPoints;
GLushort topRow = bottomRow + NumYPoints;
for (i = 0; i < NumXPoints; ++i)
{
*index++ = topRow + i;
*index++ = bottomRow + i;
}
*index++ = RestartIndex;
}
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
}
glPrimitiveRestartIndex(RestartIndex);
glEnable(GL_PRIMITIVE_RESTART);
}
void display(void)
{
//int i, start;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1, 1, 1);
//glDrawElements(GL_TRIANGLE_STRIP, NumStrips*(NumPointsPerStrip + 1), GL_UNSIGNED_SHORT, ptimb);
glDrawElements(GL_TRIANGLE_STRIP, NumStrips*(NumPointsPerStrip + 1), GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (350, 350);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}[/code]
烦楼主给看一下,只要能编译通过就行,谢谢!
我来回复