和書のサポートサイトからは、Qt 版のソースコードがダウンロードできます。
GLSL.zip
洋書のサポートサイトからは、Qt 版と VS2010 版のソースコードがダウンロードできます。
4767_Code.zip [Qt 版]
glslcookbook-master.zip [VS2010 版]
いずれのソースコードも、そのままの状態だとビルドができないプロジェクトが結構あります。
和書・洋書、両方のサポートサイトを見ても、現時点では誤植や修正についての記載がないので、
ここでは、Qt 版のソースコードをビルドする際の修正手順をまとめてみました。
生成したプログラムをマウスなどでインタラクティブに操作したい場合には、
GUI のコードが含まれている Qt 版が適しているように思います。
■ ソースコードの文字コードの問題
Qt の ***.pro ファイルを開いた後、文字コードの問題のために編集・保存できないことがあります。
このような場合は、一度 Qt を終了し、テキストエディタで文字コードを UTF-8 に変換してから保存すれば、
Qt での文字コードの問題が回避されます。
文字コードを自由に変換できるフリーのテキストエディタとしては、
NotePad++
がお勧めです。最新版は、現時点では 6.2.1 です。
■ 動作確認に用いたノートPCとOS
Windows 7 Ultimate SP1 64bit
Intel Core i7 (4 Core x HT → 8 Thread)
32 GB (PC3-10600 DDR3 SDRAM 8 GB x 4)
SSD 1TB (512 GB x 2, Raid 0)
NVIDIA GeForce GTX 675M
■ ビデオドライバー
NVIDIA Ver. 306.94
注意:
ビデオカードとビデオドライバーが
OpenGL 4.0 以上をサポートしている必要があります。
■ 開発環境
Visual Studio 2010 が既にインストールされているものとします。
無償の Visual C++ 2010 Express では試していませんが、大丈夫だと思います。
Qt のオープンソース版は、qt-project.org よりダウンロードできます。
Qt Libraries 4.8.3 for Windows (VS2010)
Qt Creator 2.6.0 for Windows
の2つをインストールしておきます。
様々なパッケージが含まれた Qt SDK には、本書のビルドに対しては余分なパッケージが含まれているので、
Qt SDK のインストール時に、パッケージの選択に困るような場合は、上記の2つをインストールをすることをお勧めします。
■ Qt のインストールと設定
Qt の2つのパッケージは、いずれもデフォルトの場所にインストールしたものとします。
Qt Libraries
C:¥Qt¥4.8.3
Qt Creator
C:¥Qt¥qtcreator-2.6.0
システムの環境変数の Path に、
C:¥Qt¥4.8.3¥bin
を追加しておくと、Qt Creator を抜けた後でも、***.exe を実行できるようになります。
■ 使用するAPI(2012-11-26 現在の最新版)
GLEW 1.9.0 (32bit版バイナリ)
GLEW 1.9.0 (ソースコード)
補足:
ソースを Debug 構成でビルドすると、
glew32d.lib と glew32d.dll を生成できます。
GLM 0.9.3.4
libnoise 1.0.0
libnoiseheaders-1.0.0.zip
libnoisedll-1.0.0.zip
■ API に含まれる関連ファイルのインストール先
● Include
C:¥Qt¥4.8.3¥include¥GL¥glew.h
C:¥Qt¥4.8.3¥include¥GL¥glxew.h
C:¥Qt¥4.8.3¥include¥GL¥wglew.h
C:¥Qt¥4.8.3¥include¥glm¥ [フォルダごとコピー]
C:¥Qt¥4.8.3¥include¥noise¥ [フォルダごとコピー]
● Lib
C:¥Qt¥4.8.3¥lib¥glew32.lib
C:¥Qt¥4.8.3¥lib¥glew32d.lib
C:¥Qt¥4.8.3¥lib¥libnoise.lib
● DLL
C:¥Windows¥System32¥glew32.dll
C:¥Windows¥System32¥glew32d.dll
C:¥Windows¥System32¥libnoise.dll
■ 各章に共通するコードの修正内容
注意:
以下のコードは、2012-11-26 現在の 4767_Code.zip のファイルを元にしています。
● glslprogram.cpp 038-044 行目
-------------------------------------------------
ostringstream code;
while (inFile.good())
{
int c = inFile.get();
if (!inFile.eof()) // ← この行を追加
code << (char) c;
}
inFile.close();
-------------------------------------------------
上記で追加する1行は、既にこの行が入っているプロジェクトと
抜け落ちているプロジェクトとがあります。
● mainview.cpp 040-049 行目
-------------------------------------------------
glewExperimental = GL_TRUE; // ← この行を追加
GLenum err = glewInit();
if (GLEW_OK != err)
{
cout <<"Error initializing GLEW: " << glewGetErrorString(err) << endl;
GLUtils::checkForOpenGLError(__FILE__,__LINE__); // ← この行を下から移動
}
-------------------------------------------------
● GLM の新しいパッケージでは、matrix_projection.hpp の内容が
他に移動して、ファイル自体がなくなったので、
下記のインクルード文で、エラーが発生したらコメントアウトする。
-----------------------------------------------
//#include <glm/gtc/matrix_projection.hpp>
-----------------------------------------------
● 各章のプロジェクトにおいて、シーンを変えたい場合は、
mainview.cpp の先頭で、必要なシーンに対応するヘッダーファイルを
インクルードし、30行目あたりに書かれている
scene = new SceneXXXXX();
のクラス名を必要なシーンのクラス名に変更します。
■ 第1章のコードの修正内容
● scenebasic.cpp 039 行目 と 102 行目
scenebasic_layout.cpp 038 行目 と 099 行目
scenebasic_uniform.cpp 040 行目 と 101 行目
scenebasic_uniformblock.cpp 083 行目 と 144 行目
-------------------------------------------------
shaderCode[--i] = '¥0'; // ← i++ を --i に変更
-------------------------------------------------
■ 第3章のコードの修正内容
● scenemultilight.cpp 035 行目
-----------------------------------------------------
_snprintf(***); // ← snprintf(***)
-----------------------------------------------------
■ 第4章のコードの修正内容
● scenereflectcube.cpp の 44行目で
読み込んでいるテクスチャのフォルダ
texture/debevec/stpeters_cross
は存在していないので、Visual Studio 2010 版の
glslcookbook-master.zip
を解凍して、
glslcookbook-master¥media¥texture¥cubemap_night¥
のフォルダを
chapter04¥texture¥
の中にコピーしておく。
● scenereflectcube.cpp 044行目
-----------------------------------------------
loadCubeMap("texture/cubemap_night/night"); // ← "texture/debevec/stpeters_cross"
-----------------------------------------------
● scenereflectcube.cpp 046-059 行目
のコードは未使用なのでコメントアウトする。
-----------------------------------------------
/*
// Load moss texture file
const char * texName = "texture/debevec/stpeters_cross_negz.png";
・・・省略・・・
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
prog.setUniform("TestTex", 1);
*/
-----------------------------------------------
● scenerefractcube.cpp 044 行目
-----------------------------------------------
loadCubeMap("texture/cubemap_night/night"); // ← "texture/debevec/stpeters_cross"
-----------------------------------------------
● scenerendertotex.cpp 003-005 行目
-----------------------------------------------
#include <iostream> // ← この行を追加: 三角括弧が削除されるため、ここでは全角にしています
using std::cout; // ← この行を追加
using std::endl; // ← この行を追加
-----------------------------------------------
● scenerendertotex.cpp 038 行目
-----------------------------------------------
angle = (float)( TO_RADIANS(140.0f) ); // ← 0.0
-----------------------------------------------
● scenerendertotex.cpp 083-088 行目
-----------------------------------------------
// Set the targets for the fragment output variables
GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, drawBuffers);
GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER); // ← この行を追加
if( result == GL_FRAMEBUFFER_COMPLETE) { // ← この行を追加
cout << "Framebuffer is complete" << endl; // ← この行を追加
} else { // ← この行を追加
cout << "Framebuffer error: " << result << endl; // ← この行を追加
} // ← この行を追加
// Unbind the framebuffer, and revert to default framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
-----------------------------------------------
● scenerendertotex.cpp 144 行目
-----------------------------------------------
prog.setUniform("Material.Shininess", 1.0f); // ← 0.0f
-----------------------------------------------
● skybox.cpp において、
-----------------------------------------------
66: glVertexAttribPointer(****, ((GLubyte *)NULL + (0)) ); → NULL が未定義
77: glDrawElements(***, ((GLubyte *)NULL + (0))); → NULL が未定義
-----------------------------------------------
のエラーが発生するので、
NULL の定義が含まれている stddef.h を1行目でインクルードする。
skybox.cpp 001 行目
-----------------------------------------------
#include "stddef.h" // ← この行を追加
#include "skybox.h"
#include "defines.h"
・・・
-----------------------------------------------
■ 第5章以降の修正について
第5章以降も、上記と同じか、もうちょっと込み入った修正をしないと
ビルド+実行ができません。
特に、第7章のシェーダ―のコードや、第8章のノイズのコードは、
筆者がかなり混乱して書いてしまった痕跡が数多くみられ、
シェーダ―に関する基本的なミスも見受けられます。
各章のプロジェクトの全てのシーンを正常に動作させるために、
修正したログが全体で800行ほどになってしまったので、
残念ながら、この投稿記事には全てを書ききれませんでした。
本書は大変優れた内容が書かれていることには違いないので、
本書を読まれる方は、コードの修正もある意味、一つの学習と考えて、
読み進まれてみてはいかがと存じます。
洋書のサイトからダウンロードできる VS2010 版のほうが、
Qt 版よりも修正項目が少なくて済みました。
VS2010 版の場合は、premake4 を使った
Unofficial OpenGL Software Development Kit (GLSDK)
のインストールが必要になります。
無料のKindleアプリをダウンロードして、スマートフォン、タブレット、またはコンピューターで今すぐKindle本を読むことができます。Kindleデバイスは必要ありません。
ウェブ版Kindleなら、お使いのブラウザですぐにお読みいただけます。
携帯電話のカメラを使用する - 以下のコードをスキャンし、Kindleアプリをダウンロードしてください。
OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング- 大型本 – 2012/11/1
【本書の特徴】
本書は最初にそれぞれのテクニックの背後にある理論と背景を詳しく述べ、分かりやすい例を提供してから、その実装に必要なGLSLとOpenGLのコードを示して説明します。テクスチャリング、画面空間テクニック、ライティング、シェーディング、テセレーション、シェーダ、ジオメトリ シェーダ、影などのトピックを含む、初歩のレベルから高度なテクニックまでを紹介します。
本書の内容
・シェーダ プログラムのコンパイル、インストール、プログラムとの通信
・サブルーチンやユニフォーム ブロックなど、GLSL 4.0の新機能を使う
・ディフューズとスペキュラ シェーディング, フラグメント単位のシェーディング、スポットライトなど基本的なライティングとシェーディングのテクニックの実装
・1つ、あるいは複数のテクスチャの適用
・テクスチャを環境マップとして使い反射や屈折をシミュレート
・ガンマ補正、ブラー フィルタ、遅延シェーディングなどの画面空間テクニックを実装
・ジオメトリ シェーダとテセレーション シェーダの実装
【目次】
Chapter 1: GLSL 4.0入門
Chapter 2: GLSLシェーダの基本
Chapter 3: ライティング、シェーディング効果と最適化
Chapter 4: テクスチャの使い方
Chapter 5: 画像処理と画面空間テクニック
Chapter 6: ジオメトリ シェーダとテッセレーション シェーダを使う
Chapter 7: 影
Chapter 8: シェーダでノイズを使う
Chapter 9: アニメーションとパーティクル
本書は最初にそれぞれのテクニックの背後にある理論と背景を詳しく述べ、分かりやすい例を提供してから、その実装に必要なGLSLとOpenGLのコードを示して説明します。テクスチャリング、画面空間テクニック、ライティング、シェーディング、テセレーション、シェーダ、ジオメトリ シェーダ、影などのトピックを含む、初歩のレベルから高度なテクニックまでを紹介します。
本書の内容
・シェーダ プログラムのコンパイル、インストール、プログラムとの通信
・サブルーチンやユニフォーム ブロックなど、GLSL 4.0の新機能を使う
・ディフューズとスペキュラ シェーディング, フラグメント単位のシェーディング、スポットライトなど基本的なライティングとシェーディングのテクニックの実装
・1つ、あるいは複数のテクスチャの適用
・テクスチャを環境マップとして使い反射や屈折をシミュレート
・ガンマ補正、ブラー フィルタ、遅延シェーディングなどの画面空間テクニックを実装
・ジオメトリ シェーダとテセレーション シェーダの実装
【目次】
Chapter 1: GLSL 4.0入門
Chapter 2: GLSLシェーダの基本
Chapter 3: ライティング、シェーディング効果と最適化
Chapter 4: テクスチャの使い方
Chapter 5: 画像処理と画面空間テクニック
Chapter 6: ジオメトリ シェーダとテッセレーション シェーダを使う
Chapter 7: 影
Chapter 8: シェーダでノイズを使う
Chapter 9: アニメーションとパーティクル
- 本の長さ304ページ
- 言語日本語
- 出版社ボーンデジタル
- 発売日2012/11/1
- 寸法1.2 x 18.2 x 25.7 cm
- ISBN-104862461891
- ISBN-13978-4862461896
この商品をチェックした人はこんな商品もチェックしています
ページ 1 以下のうち 1 最初から観るページ 1 以下のうち 1
登録情報
- 出版社 : ボーンデジタル (2012/11/1)
- 発売日 : 2012/11/1
- 言語 : 日本語
- 大型本 : 304ページ
- ISBN-10 : 4862461891
- ISBN-13 : 978-4862461896
- 寸法 : 1.2 x 18.2 x 25.7 cm
- Amazon 売れ筋ランキング: - 570,328位本 (本の売れ筋ランキングを見る)
- - 577位ゲームプログラミング
- カスタマーレビュー:
-
トップレビュー
上位レビュー、対象国: 日本
レビューのフィルタリング中に問題が発生しました。後でもう一度試してください。
2012年11月25日に日本でレビュー済み
Amazonで購入
2021年9月11日に日本でレビュー済み
Amazonで購入
GLSLについて無知でしたが、最高の良書と噂されている本書を読むために長い期間予習しており、やっと小遣いに余裕ができたので、投資することにしました。
OpenGLについての基礎知識は必要です。本書では20,21PにOpenGLを使ったオブジェクト描画の核心的なソースが出てきますが、予備知識の無い人はこの部分で先に進めなくなるでしょう。それほど難しい技術です。
全体的に分かり易い文体で記述されています。床井博士の執筆された書籍も読みましたが、20回ほど読み直しても理解できない部分もあり、読み進められず放置したものもあります。本書は今第3章まで読み進めていますが、翻訳が正確なこともあり、ここまで100%理解できています。早くテッセレーションをマスターしたいです。
流通数が少なく入手が難しいので高価なようですが、読解できれば有力な技術が得られます。入門書として強くお勧めします。
描画結果の印刷がカラーではありませんが、これは印刷のコストダウンではなくプログラムによって描画結果を白黒にしているのです。その方が読む側にとっては理解しやすいのです。カラー化するためのプログラムの追加は簡単です。
OpenGLについての基礎知識は必要です。本書では20,21PにOpenGLを使ったオブジェクト描画の核心的なソースが出てきますが、予備知識の無い人はこの部分で先に進めなくなるでしょう。それほど難しい技術です。
全体的に分かり易い文体で記述されています。床井博士の執筆された書籍も読みましたが、20回ほど読み直しても理解できない部分もあり、読み進められず放置したものもあります。本書は今第3章まで読み進めていますが、翻訳が正確なこともあり、ここまで100%理解できています。早くテッセレーションをマスターしたいです。
流通数が少なく入手が難しいので高価なようですが、読解できれば有力な技術が得られます。入門書として強くお勧めします。
描画結果の印刷がカラーではありませんが、これは印刷のコストダウンではなくプログラムによって描画結果を白黒にしているのです。その方が読む側にとっては理解しやすいのです。カラー化するためのプログラムの追加は簡単です。
2015年4月7日に日本でレビュー済み
Amazonで購入
本当の初心者向けではないし、スクラップ状態なサンプルコードに怒りすら覚える内容です。
特にサンプルコードは酷いです。誰も知らないユーザー関数が使われていたりするので、訳が分からないです。
これを元にOpenGLが理解できると思ったら大間違いです。
特にサンプルコードは酷いです。誰も知らないユーザー関数が使われていたりするので、訳が分からないです。
これを元にOpenGLが理解できると思ったら大間違いです。
2016年6月24日に日本でレビュー済み
Amazonで購入
固定機能で書かれていたものを更新するためシェーダーで書き換える必要があり、その目的を達成することができる本でしたのでとても満足しています。
掲載されている写真がカラーであればなおよいとは思いました。
掲載されている写真がカラーであればなおよいとは思いました。
2015年9月14日に日本でレビュー済み
OpenGL+GLSL4.0を対象としたシェーダーの書き方をひたすら解説した本です。
OpenGL1.2以前は固定機能としてハードウェアで実装されていた機能の他、
追加されたシェーダー2種、Transform Feedbackといった新機能、
ポストエフェクトやPerlinノイズといった視覚効果などが取り上げられています。
とにかくシェーダーのサンプルを書き写して勉強する人向けです。
ただしOpenGL側の解説は最低限に留められているので他の情報源を参照のこと。
2010年頃の題材なので最近の環境だとサンプルのビルドも一筋縄ではいかない模様ですが、
GLUTやSDL等の環境に移植するのは難しくないです。
#私はSDLベースの自作環境に移植して勉強しました
8章で使われているlibnoiseなんかもフリーの優れたライブラリなんですが、
2006年以降全くメンテされていないのでMakefile等を自分で書ける人でないと試せないでしょう。
なお、サンプルですがシェーダー側はかなり洗練されたコードですが、
C++側はろくにコメントがなく、教材としてはかなり微妙というかダメな部類です。
決して難しくはないので色々書き直して自作ライブラリの叩き台にするくらいの覚悟で勉強すると良いと思われます。
OpenGL1.2以前は固定機能としてハードウェアで実装されていた機能の他、
追加されたシェーダー2種、Transform Feedbackといった新機能、
ポストエフェクトやPerlinノイズといった視覚効果などが取り上げられています。
とにかくシェーダーのサンプルを書き写して勉強する人向けです。
ただしOpenGL側の解説は最低限に留められているので他の情報源を参照のこと。
2010年頃の題材なので最近の環境だとサンプルのビルドも一筋縄ではいかない模様ですが、
GLUTやSDL等の環境に移植するのは難しくないです。
#私はSDLベースの自作環境に移植して勉強しました
8章で使われているlibnoiseなんかもフリーの優れたライブラリなんですが、
2006年以降全くメンテされていないのでMakefile等を自分で書ける人でないと試せないでしょう。
なお、サンプルですがシェーダー側はかなり洗練されたコードですが、
C++側はろくにコメントがなく、教材としてはかなり微妙というかダメな部類です。
決して難しくはないので色々書き直して自作ライブラリの叩き台にするくらいの覚悟で勉強すると良いと思われます。