回 帖 发 新 帖 刷新版面

主题:[原创]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个回复)

71 楼


新人帮顶了~

72 楼

再来顶一下

73 楼

lz您好,我又来发问了,先谢谢。
这次想请问lz有没有从帧缓存直接转换成纹理然后显示出来的例程呢?具体用到的应该是glCopyTexImage2D函数吧。本课的第二个例子中用到了这个函数,不过太复杂了看不太懂,于是想请问下有没有单纯点演示这个函数的例程呢?十分感谢!

74 楼

glCopyTexImage2D、glCopyTexSubImage2D都是可以的。这两个函数是把颜色缓存的数据拷贝到纹理中,但有一点区别:glCopyTexImage2D是重新制定纹理数据,以前的数据就作废了。而glCopyTexSubImage2D是修改纹理数据,没有修改的区域将会维持原样。
其实glCopyTexImage2D就相当于是先glReadPixels再glTexImage2D。只不过数据复制的路线更短,速度更快,而且不用我们去分配内存作为临时空间。而glCopyTexSubImage2D就相当于是先glReadPixels再glTexSubImage2D。

写了一个简单的程序:
[code=c]#include <GL/glut.h>
#include <stdio.h>

void display()
{
    // 第一步,绘制一些东西。这里绘制一个四边形
    glDisable(GL_TEXTURE_2D);

    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_QUADS);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(-1.0f, -1.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex2f(1.0f, -1.0f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex2f(1.0f, 1.0f);
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex2f(-1.0f, 1.0f);
    glEnd();

    // 第二步,把绘制好的像素拷贝到纹理中
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 512, 512);

    // 第三步,使用纹理再绘制别的东西
    glEnable(GL_TEXTURE_2D);

    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(-1.0f, -1.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(0.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(1.0f, 1.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0.0f, 1.0f);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(512, 512);
    glutCreateWindow("OpenGL Texture Sample");
    glutDisplayFunc(&display);

    // 先用glTexImage2D创建一个纹理。这样以后就可以使用glCopyTexSubImage2D了
    // 如果这里不这样做,那以后就需要用glCopyTexImage2D。
    // 注意glCopyTexSubImage2D的效率更高
    // 最后一个参数为NULL,表示现在并不指定像素。
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512,512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    // 设置纹理参数。这里设置了就不必每次在display函数中设置
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glutMainLoop();
    return 0;
}[/code]

75 楼


先学学,先谢谢!

76 楼

eastcowboy,您好。看您以前纹理的教程中创建纹理都是要用到glEnable(GL_TEXTURE_2D) 、 glGenTextures 和 glBindTexture 函数的。而这里您只是用glTexImage2D就可以直接创建纹理了,请问有什么区别吗?
    谢谢您!

77 楼

呵呵,测试可以像我那样写。
如果您觉得可以确保整个程序只会用到一个纹理的话,就可以不必使用glGenTextures和glBindTexture,否则的话就需要了。

78 楼

好的,谢谢

79 楼

最近没有什么问题 过来顶顶 ^_^

80 楼

谢谢楼主,竟然有这么好的东西。

我来回复

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