討論區快速選單
知識庫快速選單
下載Alexa Toolbar讓你上網更有趣 傑米的攝影旅遊筆記 最新Microsoft免費研討會行事曆
[ 回上頁 ] [ 討論區發言規則 ]
glut 教學 - 透明色
更改我的閱讀文章字型大小
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 04:52:20
所謂透明色, 是除了 紅 綠 藍 之外的我們會用到的顏色, 最簡單的應用就是去除背景, 就是在設計網頁時常會用到的 透明背景 gif 圖檔一般.

當我們討論色彩質數時, 只有 紅 綠 藍 三色 而每個顏色也用 8bit 來表達的話, 因為 紅 綠 藍 三色都用 8 bit, 這麼就總共 24 bit 了, 我們會叫這樣定義的顏色作 24 bit color, 在 紅 綠 藍 三色 之上再多加 8bit 的透明色, 我們會叫作 32 bit color.

在開始介紹程式碼之先, 你要先準備有透明底色的圖檔. 但是, 要找這個會有點難, 因為常用的圖檔格式許多也沒有照顧到 透明色, 就算照顧到 透明色 的 圖檔格式, 也不容易找到軟體支援它, 為了簡化這個問題, 我們會退而求其次, 就是, 改為使用單色背景的 bmp 圖檔, 在讀取圖檔之後, 再由我們的程式填寫 透明色.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:02:30
這個, 會用到
  "glut 教學 - 把我的圖放到視窗上!!"
請先看畢這個教學, 才開始這個.

還有, 你需要準備一個 單色背景的 bmp 圖檔.

這次教學, 我們會多加一個 class, GBmp32, 這個, 基本上就是 GBmp, 只是, 每 pixel 的資料由 24 bit 改為 32 bit, 而且還會根據特定顏色填寫透明色.


"準備好了嗎?"

"都準備好了"

"嗯, 好好好..., 我們開始了"
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:03:09
/////////////////////////
// g_bmp32.h
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//

#ifndef G_BMP32_H
#define G_BMP32_H

class GBmp32
{
  public:
    int w,h;
    unsigned char *rgba;

    GBmp32();
    ~GBmp32();
    void load( const char *spath, unsigned char r=255, unsigned char g=0, unsigned char b=255 );

};

#endif
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:03:37
/////////////////////////
// g_bmp32.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#include "g_bmp.h"

#include "g_bmp32.h"

GBmp32::GBmp32()
{
  memset( this, 0, sizeof(GBmp32) );
}

void GBmp32::load( const char *spath, unsigned char r, unsigned char g, unsigned char b )
{
  if(rgba) free(rgba);
  GBmp bm;
    bm.load( spath );

  w = bm.w;
  h = bm.h;
  rgba = (unsigned char*) malloc( w*h*4*sizeof(unsigned char) );

  int i,j;
  for( j=0; j<h; j++ )
    for( i=0; i<w; i++ )
    {
     memcpy( &rgba[(j*w+i)*4], &bm.rgb[(j*w+i)*3], 3*sizeof(unsigned char) );

     if(
     bm.rgb[(j*w+i)*3 ] == r &&
     bm.rgb[(j*w+i)*3+1] == g &&
     bm.rgb[(j*w+i)*3+2] == b
     ){
     rgba[(j*w+i)*4+3] = 0;
     }else
     {
     rgba[(j*w+i)*4+3] = 1;
     }
    }
}

GBmp32::~GBmp32()
{
  if(rgba) free(rgba);
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:07:52
/////////////////////////
// glutTest05.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//


#include <stdio.h>

#include "glut.h"
#include "g_bmp32.h" // 更改了

GBmp32 bm0; // 更改了

void display()
{
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glRasterPos2f( -bm0.w/640.0, -bm0.h/640.0 );
    glDrawPixels( bm0.w, bm0.h, GL_RGBA, GL_UNSIGNED_BYTE, bm0.rgba ); // 更改了

  glutSwapBuffers();
}

void main()
{
  glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA ); // 更改了
  glutInitWindowSize( 640, 640 );
  glutCreateWindow( "hihi" );
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  glutDisplayFunc(display);

  glEnable( GL_ALPHA_TEST ); // 更改了
  glAlphaFunc( GL_GREATER , 0 ); // 更改了
  bm0.load( "a.bmp", 0,0,0 ); // 更改了

  glutMainLoop();
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:10:58
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA ); // 更改了

首先, 我們要先設定好 display mode, 因為要使用透明色, 因此, 本來的 GLUT_RGB 就要改成 GLUT_RGBA .

作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:13:19
glEnable( GL_ALPHA_TEST );
  glAlphaFunc( GL_GREATER , 0 );

這是說, 我們現在要使用 alpha test, alpha 值大於零的, 才畫出來.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:15:03
glDrawPixels( bm0.w, bm0.h, GL_RGBA, GL_UNSIGNED_BYTE, bm0.rgba ); // 更改了

當然, 把 memory block 交給 glDrawPixels, 資料格式也要由 GL_RGB 改成 GL_RGBA 呀.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:18:48
最後, 就是 GBmp32 的應用, 這個是我寫的小工具, 功能就是讀取 bmp 檔, 然後把特定的顏色的 alpha 值設成 0, 其餘的則設成 1.

bm0.load( "a.bmp", 0,0,0 );

這裡的 0,0,0 是背景色的 r g b.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/4/1 下午 05:32:16
除了做透明背景, 透明色還有其他更有趣的應用的, 例如, 你可以應用 GL_BLEND 來輕鬆的做出半透明 甚至 漸變透明 等等... ...

好了, 現在, 做一個功課吧, 就是, 用 GBmp32 讀取三個以上的 單色背景 bmp 圖檔, 然後把它們重疊顯示, 好讓人們看出背景是透明的.
作者 : shengbao(sheng) 人氣指數超過10000點
[ 貼文 124 | 人氣 11963 | 評價 130 | 評價/貼文 1.05 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/12/9 下午 12:23:25

>/////////////////////////
>// g_bmp32.cpp
>//
>// Created by Gary Ho, ma_hty@hotmail.com, 2005
>//
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <memory.h>
>
>#include 'g_bmp.h' <--這個 Head file 沒有提供到,無法編譯~
>
>#include 'g_bmp32.h'
>
如上所述,希望能提供測試~謝謝
作者 : shengbao(sheng) 人氣指數超過10000點
[ 貼文 124 | 人氣 11963 | 評價 130 | 評價/貼文 1.05 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/12/9 下午 12:32:21

>/////////////////////////
>// g_bmp32.cpp
>//
>// Created by Gary Ho, ma_hty@hotmail.com, 2005
>//
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <memory.h>
>
>#include 'g_bmp.h' <--這個 Head file 沒有提供到,無法編譯~
>
>#include 'g_bmp32.h'
>
如上所述,希望能提供測試~謝謝
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2079 | 人氣 89850 | 評價 9950 | 評價/貼文 4.79 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/12/9 下午 02:37:47
>> #include 'g_bmp.h' <--這個 Head file 沒有提供到,無法編譯~
>如上所述,希望能提供測試~謝謝

g_bmp.h 和 g_bmp.cpp 的原碼, 可以在以下網址找到.

http://www.programmer-club.com.tw/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=opengl&id=774

 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2680 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625