游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1469|回复: 1

像素透明的处理问题

[复制链接]

2

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-4-2 09:47:00 | 显示全部楼层 |阅读模式
我写了一个测试像素透明的处理程序,但是程序的执行效果却什么也看不到,是什么原因呢,纹理参数,还是纹理数据呢?

代码:

#include <iostream>
#include <gl/glut.h>
#include <gl/GLAux.h>

#pragma comment(lib, "glaux.lib")

unsigned char *texture = NULL;

void init()
{
        AUX_RGBImageRec *pImage = NULL;
        pImage = auxDIBImageLoadA("pic\\NPC_02.BMP");
        if (pImage == NULL)
        {
                std::cout << "error load npc_01.bmp" << std::endl;
                return;
        }

        // the picture is a bitmap file, and it has no alpha channel, we
        // create one for it
        // save the rgb components of left-up corner pixel, which is to be set as alpha
        unsigned char r = 0, g = 0, b = 0;
        r = *(pImage->data), g = *(pImage->data + 1), b = *(pImage->data + 2);

        // how many bytes does the texture with alpha channel require?
        texture = new unsigned char[pImage->sizeX*pImage->sizeY*4];
        // copy pixel
        for (int i = 0; i < pImage->sizeX; i++)
                for (int j = 0; j < pImage->sizeY; j++)
                {
                        *(texture + i*pImage->sizeX*4 + j*4)        = *(pImage->data + i*pImage->sizeX*3 + j*3);        // r
                        *(texture + i*pImage->sizeX*4 + j*4 + 1)= *(pImage->data + i*pImage->sizeX*3 + j*3 + 1);        // g
                        *(texture + i*pImage->sizeX*4 + j*4 + 2)= *(pImage->data + i*pImage->sizeX*3 + j*3 + 2);        // b
                        if (*(pImage->data + i*3 + j*3) == r &&
                                *(pImage->data + i*3 + j*3 + 1) == g &&
                                *(pImage->data + i*3 + j*3 + 2) == b)
                        {
                                *(texture + i*pImage->sizeX*4 + j*4 + 3) = 0;                                // transparent
                        }
                        else
                        {
                                *(texture + i*pImage->sizeX*4 + j*4 + 3) = 255;                        // opacity
                        }
                }

                GLuint tex;
                glGenTextures(1, &tex);
                glBindTexture(GL_TEXTURE_2D, tex);

                // texture parameters
                glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
                gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, texture);

                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);   
                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);   
                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);   
                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);   
                glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);   

                free(pImage->data);

                glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void display()
{
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();

        glEnable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
        glEnable(GL_ALPHA_TEST);
        glAlphaFunc(GL_GREATER, 0.5f);

        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, -1.0f / 8.0f);
        glVertex2i(-32, -32);
        glTexCoord2f(1.0f / 8.0f, -1.0 / 8.0f);
        glVertex2i(32, -32);
        glTexCoord2f(1.0f / 8.0f, 0.0f);
        glVertex2i(32, 32);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2i(-32, 32);
        glEnd();

        glDisable(GL_ALPHA_TEST);
        glDisable(GL_BLEND);
        glDisable(GL_TEXTURE_2D);

        glutSwapBuffers();
}

void resize(int width, int height)
{
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-96, 96, -96, 96);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

int main(int argc, char *argv[])
{
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
        glutInitWindowSize(512, 512);
        glutInitWindowPosition(0, 0);
        glutCreateWindow("Alpha, Texturing, and Walk");

        glutReshapeFunc(resize);
        glutDisplayFunc(display);

        init();
        glutMainLoop();

        // release memory
        delete texture;

        return 0;
}

1

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2008-4-4 20:38:00 | 显示全部楼层

Re:像素透明的处理问题

你代码好像不大全啊.测试的那个函数是哪个呀?
像素透明应该是测试Alpha值吧.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表