[解決済み] glReadPixelsはどのように動作するのですか?
2022-02-01 19:37:46
質問事項
OpenGLを使い始めたばかりで、境界塗りつぶしアルゴリズムのプログラムを書いていたのですが、その際に使ったのが
glClearColor
を使用して背景色を赤に変更しましたが、ピクセル色を読み取る際に
glReadPixels
1,0,0ではなく、0,0,0というRGB値になってしまいます。
#include<stdio.h>
#include<math.h>
#include<GL/glut.h>
#include<GL/freeglut.h>
int WIDTH=500,HEIGHT=500;
void boundaryfill(int x, int y)
{
int pixel[4];
glReadPixels(x,y,1,1, GL_RGB, GL_FLOAT, &pixel);
printf("%f %f %f %f\n",pixel[0],pixel[1],pixel[2],pixel[4]);
if(pixel[0]==(float)1 && pixel[1]==(float)0 && pixel[2]==(float)0)
{
printf("njerngwneroingoierngoineriongioerngiernogineiorngoiern");
}
else
{
glBegin(GL_POINTS);
glColor3f(0,1,0);
glVertex2i(x,y);
glEnd();
glFlush();
//boundaryfill(x,y+1);
//boundaryfill(x+1,y);
//boundaryfill(x,y-1);
//boundaryfill(x-1,y);
}
}
void display()
{
glClearColor(1.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2i(250,250);
glVertex2i(-250,250);
glVertex2i(-250,-250);
glVertex2i(250,-250);
glEnd();
boundaryfill(250,250);
glFlush();
}
void myinit_func()
{
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-250,250,-250,250);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow("Boundary fill");
myinit_func();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
解決方法は?
まず
glReadPixels()
で
GL_FLOAT
しかし
pixel
は
int[]
. さらに、それを
GL_RGB
で、アルファ値が欲しいので
GL_RGBA
.
float pixel[4];
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &pixel);
次に
printf()
アルファ値を取得するには、次のようにします。
pixel[4]
を実行する必要があるため、これはタイプミスだと思われます。
pixel[3]
. また
%d
の代わりに
%f
.
printf("%f %f %f %f\n", pixel[0], pixel[1], pixel[2], pixel[3]);
最後になりましたが、デフォルトではGLUTはアルファバッファをセットアップしませんが、これは実行することで確認できます。
int bits = 0;
glGetIntegerv(GL_ALPHA_BITS, &bits);
対象者
bits
残すべき
0
. そのため、代わりに
glutInitDisplayMode
このように
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_ALPHA);
ただし
glutInitDisplayMode
を渡す必要はありません。
GLUT_RGBA
と同じなので
GLUT_RGB
. さらに、これはデフォルトなので、省略することができます。
さらに、私は
pixel[0] == (float)1
浮動小数点数の精度に起因する。その代わりに使うことをお勧めします。
GLubyte pixel[4];
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel);
printf("%u %u %u %u\n", pixel[0], pixel[1], pixel[2], pixel[3]);
そして
pixel[0] == 255
の代わりに、course を使用します。
関連
-
[解決済み] glReadPixelsはどのように動作するのですか?
-
[解決済み] gl_FragColorとout vec4カラーを使用する?
-
[解決済み] 最新のOpenGLで複数のテクスチャをレンダリングするには?
-
[解決済み] GL_COLOR_BUFFER_BITとGL_DEPTH_BUFFER_BITは何のためにあるのでしょうか?
-
[解決済み】GLSLシェーダをデバッグする方法は?
-
[解決済み】OpenGLのテキストレンダリングは、バージョン4.1現在、何が最先端なのでしょうか?[クローズド]。
-
[解決済み] Linuxでgcc/g++を使用してWindows用にコンパイルする方法は?
-
[解決済み] OpenGLのフレームバッファとレンダーバッファの概念と違いについて教えてください。
-
[解決済み] glActiveTextureとglBindTextureの違いと関係
-
[解決済み] バーテックスシェーダとフラグメントシェーダの比較 [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] FreeGLUTとGLFWの違いは何ですか?[クローズド]
-
[解決済み] 頂点シェーダとフラグメントシェーダにおけるgl_Colorとgl_FrontColorの関係を教えてください。
-
[解決済み] gl_PointSizeの動作について
-
[解決済み] glutDisplayFuncとglutPostRedisplayの関係性を理解する。
-
[解決済み] GL_COLOR_BUFFER_BITとGL_DEPTH_BUFFER_BITは何のためにあるのでしょうか?
-
[解決済み] 最新のOpenGLでレイトレーシングを行うには?
-
[解決済み】GLSLシェーダをデバッグする方法は?
-
[解決済み】OpenGLのテキストレンダリングは、バージョン4.1現在、何が最先端なのでしょうか?[クローズド]。
-
[解決済み] OpenGLのフレームバッファとレンダーバッファの概念と違いについて教えてください。
-
[解決済み] glActiveTextureとglBindTextureの違いと関係