我在MS WindowsXP下工作,我的视频卡是itel GMA4500,我的代码:
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
unsigned char* data = new unsigned char[width*height];
glPixelStorei(GL_PACK_ALIGNMENT,1);
glReadPixels(0,0,width,height,GL_STENCIL_INDEX,GL_UNSIGNED_BYTE,data);
Run Code Online (Sandbox Code Playgroud)
但是当我检查数据缓冲区时,我可以看到字节不是全为零,那么问题是什么?
是的,我确定我有一个模板缓冲区,并且在调用glReadPixels后,我检查了glGetError,没有错误.我也试过memset用零填充数据缓冲区,但结果没有改变.
我正在试图找出模板.现在我只是用模板值绘制一些框,然后读取值.每次我用GL_STENCIL_INDEX调用glReadPixels时,我都会得到GL_INVALID_OPERATION.这是有问题的代码:
glPixelStorei(GL_PACK_ALIGNMENT, 1);
GLfloat tempStencilVal = 3;
glGetError();
glReadPixels(10, g_window1Height-10, 1, 1, GL_STENCIL_INDEX, GL_FLOAT, &tempStencilVal);
if (glGetError() == GL_INVALID_OPERATION) {std::cout << "GL Invalid Operation\n";}
else {std::cout << "X: " << 10 << " Y: " << 10 << " S: " << tempStencilVal << "\n";}
Run Code Online (Sandbox Code Playgroud)
我尝试了5种不同的数据格式,3种不同的glPixelStore模式,并且重复了7次glReadPixels错误列表.(是的,OGL 2.1)如果我将STENCIL_INDEX更改为DEPTH_COMPONENT,它可以正常工作.我唯一无法确认的是我是否有模板缓冲区.是否有一些初始化我缺少或一些glGet来检查?
潜在的相关信息:Win7 x64 SP1 | 华硕GTX650Ti | VS2012旗舰版
下面是绘制框的函数的代码,以防它引起它:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, g_window1Width, -g_window1Height, 0, 0.0, 50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(1.0, -1.0, -1.0);
glTranslated(0.0, 0.0, 0.5);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | …Run Code Online (Sandbox Code Playgroud) 这是我的选择代码
public static void pick(GL11 gl){
int[] viewport = new int[4];
ByteBuffer pixel = ByteBuffer.allocateDirect(3).order(ByteOrder.nativeOrder());
mColourR = BaseObject.getColourR();
mColourG = BaseObject.getColourG();
mColourB = BaseObject.getColourB();
x = MGLSurfaceView.X();
y = MGLSurfaceView.Y();
gl.glGetIntegerv(GL11.GL_VIEWPORT,viewport,0);
gl.glReadPixels((int)x, (int)(viewport[3] - y), 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixel);
Log.d(TAG, String.valueOf(gl.glGetError()));
R = pixel.get(0);
G = pixel.get(1);
B = pixel.get(2);
Log.d(TAG, "Colour:" + pixel.get(0) + " " + pixel.get(1) + " " + pixel.get(2));
if (R == mColourR && G == mColourG && B == mColourB){
match = true; …Run Code Online (Sandbox Code Playgroud) 我用OpenGL命令绘制一个屏幕。而且我必须将此屏幕保存为.bmp或.png格式。但是我做不到。我正在使用glReadpixels,但无法继续。如何使用OpenGL在c ++中保存此图形?
好的,我尝试使用 WebGL 的 readPixels 方法将数据从着色器渲染到帧缓冲区。该技术很简单:
renderer.render(sceneRTT, cameraRTT, rtTexture, true);
var pixels = new self.Uint8Array(width * height * 4);
var gl = renderer.context;
gl.bindFramebuffer(gl.FRAMEBUFFER, rtTexture.__webglFramebuffer);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
Run Code Online (Sandbox Code Playgroud)
我通过将着色器的 gl_FragCoord 更改为 gl_FragCoord = vec4(255,120,35,100) 来测试这一点,尽管任何值当然都是有效的。
问题是,像素总是返回不正确的值,即使我指定了上面这样的常量值!可能是什么原因造成的?
注意:这个问题出现在我测试的每个着色器上,包括其他人的工作小提琴
好吧,我会尽可能保持简单。我想在着色器程序之间传递数据。我目前正在使用 readPixels 来执行此操作,但我觉得它可能会减慢操作速度,并且我正在探索更快的选项。
我的程序的作用:
我的问题:
预先感谢任何回答的人。
我尝试渲染像素颜色.
gl.glColor3f(1f, 0, 0);
//draw
gl.glReadPixels(lastX - pw / 2, MyCanvas.this.getHeight()
- (lastY - ph / 2), pw, ph, GL.GL_RED, GL.GL_FLOAT,
pixelBuffer);
float r, g, b;
r = pixelBuffer.getFloat();
g = pixelBuffer.getFloat();
b =pixelBuffer.getFloat();
pixelBuffer.rewind();
System.out.println(r+" "+g+" "+b);
Run Code Online (Sandbox Code Playgroud)
屏幕上有真正的纯红色,但glReadPixels返回到非常奇怪的值4.6006E-41,为什么???
我希望捕获我在openGL中渲染的图像.我使用glReadPixels,然后使用CImg保存图像.不幸的是,结果是错误的.见下文.左边的图像是正确的.我用GadWin PrintScreen捕获了它.右侧的图像不正确.我用glReadPixels和CImg创建了它:

我已经做了很多关于可能出错的网络研究,但是我没有办法去追求.这里捕获图像的代码:
void snapshot() {
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
int bytes = width*height*3; //Color space is RGB
GLubyte *buffer = (GLubyte *)malloc(bytes);
glFinish();
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
glFinish();
CImg<GLubyte> img(buffer,width,height,1,3,false);
img.save("ScreenShot.ppm");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
这是我调用快照方法的地方:
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawIndividual(0);
snapshot();
glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)
跟进评论,我抓住了位深度并打印到控制台.结果如下:
redbits=8
greenbits=8
bluebits=8
depthbits=24
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现洪水填充算法。但是 glReadPixels() 返回像素的浮点 RGB 值,该值与我设置的实际值略有不同,导致算法失败。为什么会发生这种情况?
输出返回的 RGB 值以进行检查。
#include<iostream>
#include<GL/glut.h>
using namespace std;
float boundaryColor[3]={0,0,0}, interiorColor[3]={0,0,0.5}, fillColor[3]={1,0,0};
float readPixel[3];
void init(void) {
glClearColor(0,0,0.5,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,500,0,500);
}
void setPixel(int x,int y) {
glColor3fv(fillColor);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
void getPixel(int x, int y, float *color) {
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,color);
}
void floodFill(int x,int y) {
getPixel(x,y,readPixel);
//outputting values here to check
cout<<readPixel[0]<<endl;
cout<<readPixel[1]<<endl;
cout<<readPixel[2]<<endl;
if( readPixel[0]==interiorColor[0] && readPixel[1]==interiorColor[1] && readPixel[2]==interiorColor[2] ) {
setPixel(x,y);
floodFill(x+1,y);
floodFill(x,y+1);
floodFill(x-1,y);
floodFill(x,y-1);
}
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3fv(boundaryColor); …Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个带有过剩的程序,在一个窗口中渲染一个3D模型.我正在使用glReadPixels来获取窗口中显示的风景图像.
而且我想知道如何获得特定像素(x,y),不是直接它的颜色,而是后面的下一个物体的颜色.
如果我渲染一个蓝色三角形,并在它前面有一个红色三角形,glReadPixels会给我红色三角形的红色.
我想知道如何从蓝色三角形中获取颜色,如果红色三角形不在这里,我将从glReadPixels获得颜色.
我试图检测OpenGL中是否填充了特定像素,以实现泛洪填充算法.所以,我搜索并找到了glreadpixel函数,但我不知道如何使用这个函数以及它是否可以解决我的问题.
glreadpixels ×11
opengl ×8
c++ ×3
glut ×3
java ×2
android ×1
cimg ×1
endianness ×1
error-code ×1
glteximage2d ×1
jogl ×1
opengl-es ×1
pixel ×1
rgb ×1
three.js ×1
visual-c++ ×1
webgl2 ×1