Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c glreadpixels在不同屏幕上返回错误值_Objective C_Opengl - Fatal编程技术网

Objective c glreadpixels在不同屏幕上返回错误值

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 错误(

所以我有一个插件,在不同的机器上显示不同。在我的机器上,当我传入我用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

下面是我在位图上创建纹理的代码

   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是相同的值吗?是的。所以我找到了原因。这是视网膜显示屏。但我仍在试验如何获得整个图像。目前它仍然缺少一半图像。