回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第十六课

现在即将放出的是第十六课的内容。

首先还是以前课程的连接:
[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],因此这里并没有放到附件中。在编译的时候应该将这两个文件和其它代码文件一起编译。

=====================未完,请勿跟帖=====================

回复列表 (共106个回复)

81 楼

如此好的东西,一定要好好学习、好好理解,力争能向楼主一样为社会,为人民做贡献!

82 楼


[em1]顶!就是下载不了啊???~~~~(>_<)~~~~   郁闷ing!

83 楼

[quote]顶!就是下载不了啊???~~~~(>_<)~~~~   郁闷ing![/quote]
顶楼的附件是可以成功下载的啊。我刚才用迅雷试过了,下载成功。

84 楼


看完了您的十六章课程感觉很不错!谢谢您的勤劳付出!!
请问还有没有新的课程??
非常期待...!

85 楼

谢谢,刚看到这个帖子,这该是原帖,非常有帮助。
楼主还发了OpenGL的帖子没有,如有请帖上网址,
再次感谢楼主。

86 楼

从1到16帖都看过了,非常感谢楼主,特意注册个帐号支持哈

87 楼

楼主有没有作过《opengl编程指南》中的,primrestart.c这个程序,
怎么也通过不了,楼主要是作过,给上传一份源码,多谢楼主了。
真的搞不懂,看入门书的都是初学者,不给编译好源码。

88 楼

[quote]楼主有没有作过《opengl编程指南》中的,primrestart.c这个程序,
怎么也通过不了,楼主要是作过,给上传一份源码,多谢楼主了。
真的搞不懂,看入门书的都是初学者,不给编译好源码。[/quote]
不知你是否可以提供更多的信息?如果是编译错误的话,可以把错误信息贴出来。
另:VC系列的编译器,虽然自带了gl.h这个头文件,但那是OpenGL 1.1版本的,后面版本新增的函数都无法直接调用。关于这个问题,你可以看看本教程第十四课。第九楼介绍了一个小工具,GLEE,利用它可以在VC(或者其它一些平台)中方便的调用更高版本的OpenGL函数。当然了,这个细节其实是VC和Windows的细节,而不是OpenGL本身的问题。如果楼主用苹果电脑的话,它的开发环境默认都是OpenGL 2.1版本,这样就可以直接编译通过了。

89 楼

OpenGL不知道是什么东西。惭愧,虚心学习中。。。

90 楼

[/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]
烦楼主给看一下,只要能编译通过就行,谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册