質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

解決済

1回答

2613閲覧

サンプルプログラムで、シェーダの初期化に失敗し、正常に動作しない。

zigutabi

総合スコア57

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2017/07/12 14:23

WebGLを勉強するため、古い本になりますが、以下の本を用いてWebGLの勉強をしております。
『WebGL+HTML5 3DCGプログラミング入門』2012年出版

この本は紙面を節約するため、追記しているにも関わらず、記述していない箇所が多いため、常にサンプルプログラムと見比べて作業を進めております。しかし、書籍に付属してあるサンプルプログラムの5章で動かない不具合が多々ありました。エラー内容を確認しますと、シェーダの初期化に失敗しているとあったので、出版元のホームページで正誤表を確認したのですが、該当する箇所での修正、訂正はありませんでした。どのように対処すれば、サンプルが正しく動作するでしょうか?

心当たりあることがありましたら、何卒、ご助言のほどよろしくお願いいたします。

JavaScript

1var VSHADER_SOURCE = 2 'attribute vec4 a_Position;\n' + 3 'attribute vec4 a_Color;\n' + 4 'varying vec4 v_Color;\n' + 5 'void main() {\n' + 6 ' gl_Position = a_Position;\n' + 7 ' gl_PointSize = 10.0;\n' + 8 ' v_Color = a_Color;\n' + 9 '}\n'; 10 11// フラグメントシェーダのプログラム 12var FSHADER_SOURCE = 13 'varying vec4 v_Color;\n' + 14 'void main() {\n' + 15 ' gl_FragColor = v_Color;\n' + 16 '}\n'; 17 18function main() { 19 // Canvas要素を取得する 20 var canvas = document.getElementById('webgl'); 21 22 // WebGL描画用のコンテキストを取得する 23 var gl = getWebGLContext(canvas); 24 if (!gl) { 25 console.log('WebGLコンテキストの取得に失敗'); 26 return; 27 } 28 29 // シェーダを初期化する 30 if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) { 31 console.log('シェーダの初期化に失敗'); 32 return; 33 } 34 35以下略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

シェーダがうまくコンパイルできていない理由が、どのような内容になっているのかわからないので全然見当違いなことを言ってしまってるかもしれないですが、以下のようにしてみると、どうでしょうか。

javascript

1var FSHADER_SOURCE = 2 'precision mediump float;\n' + 3 'varying vec4 v_Color;\n' + 4 'void main() {\n' + 5 ' gl_FragColor = v_Color;\n' + 6 '}\n';

WebGL の場合は、動かない原因がブラウザの実装にある場合の他に、ハードウェア構成やドライバのせいだったりすることもあるので、実行環境も併せて記載することで、返答が得られやすくなるかもしれません。

投稿2017/07/12 14:44

doxas

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest1213

2017/07/12 15:49

Windows 10 + Chrome 59.0.3071.115にて質問者様のフラグメントシェーダにてコンパイルエラーが発生することを確認(gl.compileShader()後にgl.getShaderInfoLog()にて「ERROR: 0:1: '' : No precision specified for (float)」という内容を確認)し、こちらの回答のように小数点の精度を明示したところコンパイルできるようになりました。たしかWebGL(とOpenGL ES)は頂点シェーダはデフォルトの精度があるけど、フラグメントシェーダはデフォルトが無いので明示しなければいけないとかそんな感じだったと記憶してます。
zigutabi

2017/07/12 21:36

ありがとうございました。他のプログラムでも書き換えたところ、無事動作することを確認することができました。ハードウェアやドライバは盲点でした。この度は大変勉強となり、助かりました。本当にありがとうございました。
doxas

2017/07/13 05:36

うまくいったようで、よかったです! 少しだけ補足しますと、上記で guest1213 さんがおっしゃってるとおり、明示的に float の精度などを指定するべきなのですが、恐らくこの書籍が執筆された当時は記載がなくても動いていたマシンもあったと思うのですね。 最近では WebGL も割りと浸透してきたといいますか、徐々に枯れてきてはいるのかなと思いますが、たとえば PC 向け(Windows)の Chrome なら問題ないけど ios の safari ではダメで……みたいなことは本当によくある話なんですね。よしんば動いたとしても、Windows と Mac では結果が違う、みたいなことも普通に起こります。 これは、ブラウザの実装だけでなく、搭載されている GPU やそのドライバが様々に WebGL の実行に関わってくるからなんですね。もし今後、また WebGL 関連でわからないことがあるときは、いわゆる一般的な JavaScript の質問とは違って、環境なども大きく影響するものであることを前提に質問すると、より具体的な返答が得られると思います。
zigutabi

2017/07/14 11:35

参考になります。そうなると、機種依存の問題が孕んでくる恐れがありそうです。作品をさくらVPS、herokuに上げる計画なのですが、読込先のブラウザの機種が対応していないとへこんじゃいます。MAC買う金もないし……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問