OpenGLのglColor4xについて

2,778 views
Skip to first unread message

杉田臣輔

unread,
Apr 10, 2011, 12:28:48 PM4/10/11
to android-g...@googlegroups.com
はじめまして。杉田と申します。

OpenGLを使った三角や丸などのプリミティブ作成用のメソッドのあるクラスを作り描画を行いました。

glColor4fを使って、
gl.glColor4f(0.25f,0.25f,0.75f,1.0f);のように色を指定をしても
どうしても色が白になってしまいます。

glColor4fを無効にする設定とか有るのでしょうか?
宜しくお願いします。

作ったのはこんな感じのメソッドです。
/**
* 円を描画
*/
public static void drawCircle(GL10 gl,final float x, final float y,
final int divides, final float radius,
final int red, final int green, final int blue, final int alpha) {
float [] vertices = new float[divides * 3 * 2];//頂点の数はn角形の場合はn*3*2になる。

int vertexId = 0;

for(int i=0; i < divides; i++){
float theta1 = getRadian(divides, i);
float theta2 = getRadian(divides, i+1);

vertices[vertexId++] = x;
vertices[vertexId++] = y;

vertices[vertexId++] = (float) (cos(theta1) * radius + x);
vertices[vertexId++] = (float) (sin(theta1) * radius + y);

vertices[vertexId++] = (float) (cos(theta2) * radius + x);
vertices[vertexId++] = (float) (sin(theta2) * radius + y);
}

//色指定
gl.glColor4f(0.25f,0.25f,0.75f,1.0f);
// gl.glColor4x(red, green, blue, alpha);

gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

//ポリゴン描画
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, getFloatBuffer(vertices) );
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//3つの頂点を持つポリゴンn個で構成されている。
final int polygonNum = divides * 3;
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, polygonNum);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

tueda

unread,
Apr 11, 2011, 12:57:43 AM4/11/11
to android-g...@googlegroups.com, 杉田臣輔
こんにちは。

> glColor4fを使って、
> gl.glColor4f(0.25f,0.25f,0.75f,1.0f);のように色を指定をしても
> どうしても色が白になってしまいます。
>
glColor4xを使うと期待した色になって、glColor4fを使うと真っ白という意味で
すか?
使用したGPUが(浮動小数点に対応してない)ESのCommon Liteのみのサポートだっ
たりしませんか?

shin...@gmail.com

unread,
Apr 11, 2011, 1:25:23 AM4/11/11
to tueda, android-g...@googlegroups.com
GPUを確認したところ
NVIDIA GeForce 320M
が搭載されてました。
しかし、Common Liteのみサポートされてるかどうかの確認方法が分かりません。

shin...@gmail.com

unread,
Apr 11, 2011, 1:09:41 AM4/11/11
to tueda, android-g...@googlegroups.com
お返事ありがとうございます。
MacBook Airを使ってるので、
GPUが貧弱な可能性はあります。
Common Liteの場合はソフトウェアでの対処も無理でしょうか?

On 2011/04/11, at 13:57, tueda <tu...@wolf.dog.cx> wrote:

tueda

unread,
Apr 11, 2011, 2:08:02 AM4/11/11
to android-g...@googlegroups.com
こんにちは。


まず問題の切り分けが先決ですね。
glColor4xだと期待する通りに動いてglColor4fだと真っ白と推測したのは、
正しいのでしょうか、それとも間違っているのでしょうか?
これを確定せずにあれこれ推測するのは時間の無駄です。

もしこの推測が正しいのであればCommon Liteプロファイルを使っている可能性
が高いです。
その場合はglGetString(GL_VERSION)で確認できます。
String str = gl.glGetString(GL11.GL_VERSION);
Log.println(Log.INFO, "OpenGL", str);
手元ではログに
OpenGL ES-CM 1.1
が表示されました。手元では今Commonプロファイルを使っています。
Common Liteプロファイルを使っている場合 ES-CL が表示されるはずです。

で、もしCommon Liteプロファイルを使っているなら、あとはハードの制限なの
かSDKあたりの問題なのかを調べます。
多分ぐぐればベンダー提供のドキュメントが出てくるでしょう。
調べた結果Commonプロファイルが使えるのであればそうすべきだし、
無理ならあきらめてCommon LiteプロファイルでglColor4xを使うことになると思
います。


shin...@gmail.com

unread,
Apr 11, 2011, 3:59:43 AM4/11/11
to tueda, android-g...@googlegroups.com
> glColor4xを使うと期待した色になって、glColor4fを使うと真っ白という意味で
> すか?

すみません、このご質問返信してませんでした。
4x, 4fのどちらを使用しても白になります。

ちなみにglColorPointerを使用したサンプルは色が付きます。

tueda

unread,
Apr 11, 2011, 5:24:14 AM4/11/11
to android-g...@googlegroups.com
こんにちは。
tuedaです。

ということなら、先ほどまでのメールは全く関係ないですね(だから最初に確認
した)。
正直ソースを見ないとよくわかりませんが、通常余計なことをしなければ
glColorで色が変わります。
なぜ色が変わらないかというと、恐らく余計な事をしているからです。
想像ですが頂点カラーを使ったサンプルをコピって来て使ってますよね?
頂点カラーを使うときの3点セット、
glEnableClientState (GL_COLOR_ARRAY);
glDisableClientState (GL_COLOR_ARRAY);
glColorPointer ();
のどれかをコメントアウトせずに呼んでしまっていませんか?
多分glEnableClientState (GL_COLOR_ARRAY)が怪しいです。
全部コメントアウトして頂点カラーを使わない設定にすればglColorで色が変わ
ると思います。

shin...@gmail.com

unread,
Apr 12, 2011, 10:05:31 AM4/12/11
to tueda, android-g...@googlegroups.com
こんばんは
コンパイルの繰り返しでやっと原因が分かりました。
本のサンプルにミスがあり、
ある部分でgl.glEnable(GL10.GL_TEXTURE_2D);
を行った後の処理、glDisable()が抜けてました。
このままだとあとの処理で色が無効になってしまってようでした。

On 2011/04/11, at 13:57, tueda <tu...@wolf.dog.cx> wrote:

Reply all
Reply to author
Forward
0 new messages