Objective c glreadpixels在不同屏幕上返回错误值
所以我有一个插件,在不同的机器上显示不同。在我的机器上,当我传入我用32*32*32值生成的图像时。每隔32秒,红色值从0到1。我得到正确的结果,每32个像素,红色值从0到1。 但我在同事的机器上运行的代码和程序是一样的,不是每32像素一次,而是每64像素一次,红色值从0到1。 这个问题与屏幕分辨率有关吗?如何返回传入的正确值 示例(带红色值的前32个像素) 传入 0, 8, 16 24, 32, 40, ... 248 正确的一个(我的机器) 0, 8, 16 24, .... 248 错误(同事机器)。 0,4,8,12,16…124 下面是我在位图上创建纹理的代码Objective c glreadpixels在不同屏幕上返回错误值,objective-c,opengl,Objective C,Opengl,所以我有一个插件,在不同的机器上显示不同。在我的机器上,当我传入我用32*32*32值生成的图像时。每隔32秒,红色值从0到1。我得到正确的结果,每32个像素,红色值从0到1。 但我在同事的机器上运行的代码和程序是一样的,不是每32像素一次,而是每64像素一次,红色值从0到1。 这个问题与屏幕分辨率有关吗?如何返回传入的正确值 示例(带红色值的前32个像素) 传入 0, 8, 16 24, 32, 40, ... 248 正确的一个(我的机器) 0, 8, 16 24, .... 248 错误(
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, _texID);
if (_texID) {
glDeleteTextures(1, &_texID);
_texID = 0;
}
glGenTextures(1, &_texID);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, (int)_imageSize.width, (int)_imageSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, _image_buffer);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
这里是生成位图的代码
[self setFrameSize:_imageSize];
GLubyte al = 255; // alpha value
double increment = (al+1) / val;
_totalByteSize = val*val*val*4;
_image_buffer = new GLubyte[_totalByteSize];
for (int i = 0; i < (_totalByteSize); i++) {
_image_buffer[i] = 0;
}
vector<GLKVector3> data;
GLubyte bl = 0;
GLubyte gr = 0;
GLubyte re = 0;
for ( int b = 0; b < val; b++) {
gr = 0;
for ( int g = 0; g < val; g++) {
re = 0;
for ( int r = 0; r < val; r++) {
int ind = r + g * val + b * val * val;
_image_buffer[ind * 4 + 0] = re;
_image_buffer[ind * 4 + 1] = gr;
_image_buffer[ind * 4 + 2] = bl;
_image_buffer[ind * 4 + 3] = al;
re+= increment; // 256 / 32 = 8
}
gr+= increment; // 256 / 32 = 8
}
bl+= increment; // 256 / 32 = 8
}
[self-setFrameSize:_-imageSize];
GLubyte al=255;//α值
双增量=(al+1)/val;
_totalByteSize=val*val*val*4;
_image_buffer=new GLubyte[_totalByteSize];
对于(int i=0;i<(_totalByteSize);i++){
_图像缓冲区[i]=0;
}
矢量数据;
glubytebl=0;
GLubyte gr=0;
GLubyte re=0;
对于(int b=0;b
这里是要阅读的代码
int totalByteSize = 32*32*32*3;
GLubyte* bitmap = new GLubyte[totalByteSize];
glReadPixels(0, 0, _imageSize.width, _imageSize.height, GL_RGB, GL_UNSIGNED_BYTE, bitmap);
[_lutData removeAllObjects];
for (int i = 0 ; i <= totalByteSize /3 ; i++) {
double val1 = (double)bitmap[i*3+0] / 256.0;
double val2 = (double)bitmap[i*3+1] / 256.0;
double val3 = (double)bitmap[i*3+2] / 256.0;
[_lutData addObject:@[@(val1), @(val2), @(val3)]];
}
inttotalByteSize=32*32*32*3;
GLubyte*位图=新GLubyte[totalByteSize];
glReadPixels(0,0,_imageSize.width,_imageSize.height,GL_RGB,GL_无符号字节,位图);
[_lutdataremoveallobjects];
对于(int i=0;i您是否对glViewport使用相同的值?是的。这是相同的代码,没有任何更改。唯一不同的是不同的计算机.glViewport(0,0,size.width,size.height);两台计算机上的size.width和size.height是相同的值吗?是的。所以我找到了原因。这是视网膜显示屏。但我仍在试验如何获得整个图像。目前它仍然缺少一半图像。