私はglReadPixelsの出力を理解するのに苦労していますが、これは理論的には単純なようですが、実際には(少なくとも私にとっては)結果が不思議です。glReadPixelsは常にglClearColorで同じ値を返します
色の値がvec4(0.2、0、0、0)の単一の三角形を描画するシンプルなフラグメントシェーダを使用し、背景色が(0.3,1.0,1.0,0)に設定されているとします。私はデフォルトのフレームバッファを使用していますことを、
#include "shader.h" // shader compile/link/use
#include <GLFW\glfw3.h>
#include <iostream>
const int DISPLAY_WIDTH = 16;
const int DISPLAY_HEIGHT = 16;
//============= shader code ==========================
const GLchar *vertexShaderSource = R"glsl(#version 440
in vec2 position;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
})glsl";
const GLchar *fragmentShaderSource = R"glsl(#version 440
out vec4 outColor;
void main()
{
outColor = vec4(0.2,0.,0.,0.);
})glsl";
//============= c++ entry point ==========================
int main(int argc, char** argv) {
glfwInit();
GLFWwindow* window = glfwCreateWindow(DISPLAY_WIDTH, DISPLAY_HEIGHT, "test", NULL, NULL);
glfwMakeContextCurrent(window);
GLenum res = glewInit();
// triangle data (xy-position)
float vertices[] = {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// enable vertex xy-position attribute
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// compile, link and use shader program
Shader shader(vertexShaderSource, fragmentShaderSource);
shader.Use();
// rendering loop
while (!glfwWindowShouldClose(window)) {
glClearColor(0.3f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glFlush();
// read pixels from backbuffer
GLubyte data[DISPLAY_WIDTH * DISPLAY_HEIGHT];
glReadPixels(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, GL_RED, GL_UNSIGNED_BYTE, data);
for (int i = 0; i < DISPLAY_WIDTH * DISPLAY_HEIGHT; i++) {
int a = data[i]; // implicit conversion of unsigned char to int
std::cout << a << std::endl;
}
std::getchar(); // wait for user input
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
は、私は上記の画像を生成するために使用します(シェーダ建設を除く)の完全なコードは次のようになりますので、同じよう私のカラー値は正規化されたものとして扱われます私のジオメトリの色は(51、0、0、0)になるのに対し、私の背景色は(76,255,255、0)になります。 )。
ジオメトリを描画してバッファをスワップした後、イメージが取得されます。今私は色の値を読みたいと思います。 、私は赤チャンネルを抽出、Iはフレームバッファから読み出された画素値を検査するプロセスを容易にするために
GLubyte* data = new GLubyte[DISPLAY_WIDTH * DISPLAY_HEIGHT];
glReadPixels(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, GL_RED, GL_UNSIGNED_BYTE, data);
:それを行うために、私はバッファをスワップ直前必要glReadPixels関連するコードを挿入します画素データを格納するために必要なデータのサイズはDISPLAY_WIDTH * DISPLAY_HEIGHT
です。さらに、私がプリントアウトした値は背景色では76、ジオメトリでは51となっているはずです。
驚くべきことに、ジオメトリが無視されたように、驚いたことに、すべての単一赤チャネルピクセルデータ(すべてのDISPLAY_WIDTH * DISPLAY_HEIGHTピクセルが印刷されます)は、私が印刷すると「76」になります。描画呼び出しの後、バッファを交換する前にピクセルを読み込むことに注意してください。
ここで私が何が不足しているかを教えていただければ幸いです。私のDebianのストレッチボックスに微細
オブジェクトの背景ではなく色を取得した場合、 'glReadPixels'は「クリアカラー」と「スワップバッファ」の間を読み込んでいるようです。あるいは、最初のスワップ後にデフォルトの 'back buffer'の代わりに' front buffer'から読み込んでいます。 – Ripi2
あなたがしていることが正しいように見えます。背景ピクセルしか見ていないのですか?あなたの写真から、最初のジオメトリの前に多くの背景ピクセルが存在するでしょう... – Bahbar
[mcve]で編集してください。 [this](https://stackoverflow.com/a/8841923/44729)を自由に使用してください。 – genpfault