トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

プログラミングメモ(GLSL環境導入)

いつも通り最低限系技術メモ
OpenGLのシェーダ言語GLSLを使うための準備みたいなもの
まぁ環境導入というかなんというか……
確かめたのがWindows+VisualStudioしかないから他は知らん

GLSL調べると普通のOpenGLの関数みたいに使ってるけど
少なくともWindows環境だとただ関数呼んでも使えないんだねーと

で,大体GLEW入れろみたいなの書いてあったりするんだけど
ここでは外部ライブラリを使いたくない人向けに
ちょっと書くよ

あとはwglGetProcAddress毎回呼ぶみたいな方法もあるけど
一応gl~みたいな関数使ういろんなとこのサンプルに載ってるような書き方がしたい人向け

いつもどおり説明は追記で

全体の流れは
・glext.hを手に入れる
・ヘッダー作って関数の宣言
・関数の初期化


めんどくさいと思った人は記事の下の方までスクロール

glext.hを落としてくる


下のリンク(opengl.orgの中のglext)からglext.hを開いて保存してね
glext.hをダウンロード
これはgl.hと同じ場所に入れてもいいと思うし
ソースコードと同じ場所に置いてもいい
まぁつまりパスが通ってるところに置いてねと

ヘッダー作って関数を宣言する


正確にいうとグローバルに関数ポインタを入れておく変数を置いておく

下がそのヘッダーファイルの例
ファイル名はなんでもいいともうけど今回はglsl.hってことにしておく

//glsl.h
#ifndef GLSL_H_
#define GLSL_H_

#include <Windows.h>
#include <gl/gl.h>
#include <gl/glext.h>

extern PFNGLSHADERSOURCEPROC glShaderSource;
extern PFNGLCOMPILESHADERPROC glCompileShader;
//などなど
//使う関数を全部宣言する

//初期化用の関数を宣言
void initGLSL();

#endif

実体?はソースファイルの方に書くから
ヘッダーではexternで宣言
関数の型は
PFN+関数名をすべて大文字にしたもの+PROC
で統一されてるみたい
上の例だと
glShaderSource→PFN+GLSHADERSOURCE+PROC→PFNGLSHADERSOURCEPROC

GLSLの関数は結構数があるみたいだけど
まぁ使う物だけ書いておけばいいんじゃないかな

あと最後の方にある関数の宣言は名前はなんでもいいけど
とりあえず用意した変数に関数のアドレスを入れなきゃいけないからその処理をする関数

関数の初期化


という言い方が正しいかはわからないけど
関数ポインタを入れる変数を用意しただけだから
ちゃんとその中に関数のアドレスを入れてやらなきゃいけないと
そこでwglGetProcAddressを使ってそれぞれの関数のアドレスを取得すると
コードの例は下のような感じ

//glsl.cpp
#include "glsl.h"

PFNGLSHADERSOURCEPROC glShaderSource;
PFNGLCOMPILESHADERPROC glCompileShader;
//などなど
// 使う関数を以下略

void initGLSL(){
glShaderSource=(PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
glCompileShader=(PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
//などなど
//以下略
}

変数を宣言して
初期化関数の中でアドレスを取得して変数に詰めると
まぁそれだけだね

使い方


・上で作ったヘッダーとソースファイルをプロジェクトに入れる
・glsl.hをインクルードする
・初期化関数(上の例だとinitGLSL)を呼ぶ
・あとはどこかのサンプルと同じようにGLSLプログラミング
以上

楽したい人


すべての関数について
extern付きの宣言,変数宣言,初期化と
三種類のコードを書くのはめんどくさい
少なくとも10個ぐらいは関数使うから全部書くのはめんどくさい
まぁごもっとも
そういう人はプログラムかスクリプトを書いて出力しましょう
関数の一覧さえ用意すればあと規則的に変換するだけだからね
実際にかかる時間はともかく精神的には楽
まぁこのへんは気が向いたらツール作って公開しようかなぁとか
あとはこういうコードを拾ってくればいいと思うよ
そもそもこれも床井研究室で配布されてるコード見て
それを簡略化したものだからね



別な方法


上の方法
なんかめんどくさい
エディタ上のハイライトが変数扱いになるのは嫌
わざわざinit関数呼ばなきゃいけないとか(笑)
ヘッダーだけでなんとかならんのかよ
変数の中身書き換えられるじゃん

そんなあなたにお届けする別解

マクロを使う

#define glShaderSource(...) \
(((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"))(__VA_ARGS__))
//#define 関数名(...) (((PFN関数名大文字PROC)wglGetProcAddress("関数名"))(__VA_ARGS__))

上の行は枠からはみ出たから改行した
下の行も怪しいけど
あと括弧の位置気をつけてねと

まぁこんなかんじで書いておけば同じように使えるよ
引数はちゃんと一個一個書いてもいいけど
スクリプトかなにかで一斉に出力することを考えて上のような書き方にしてる

こっちもglext.hは必要だよ
あと命名規則と言うか型名の付け方も上と同じだよ

ただこの方法だと一回一回関数のアドレスとりに行くことになるんだろうから
何度も呼ぶならパフォーマンスが気になる人もいるかもしれない
まぁ頻繁に呼ぶものがあるかどうかは知らないけど
あとはグローバルに置きたくない人は上かなぁ
名前空間だったりクラスだったりにまとめたいときはこっちじゃ無理だし

まぁあとから気づいたから後ろに書いたけどこっちで十分だと思う
  1. 2013/03/04(月) 23:54:37|
  2. 試験的な物
  3. | トラックバック:0
  4. | コメント:0
<<プログラミングメモ(Python3.xをC++プログラムに組み込む~その1~) | ホーム | ほんのちょっとだけ進んだ戦艦のお話>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/810-ed35ed54
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

トック

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。