菜鸟教程小白 发表于 2022-12-12 09:33:32

ios - ofGrabber和ofTexture的像素格式关系


                                            <p><p>我目前正在创建一个 iOS 应用,但我无法理解从 ofGrabber 获取像素与使用 ofTexture 绘制它们之间的关系。</p>

<p>我当前的代码:</p>

<p>在 setup() 中:</p>

<pre><code>//Set iOS orientation
ofSetOrientation(OF_ORIENTATION_90_LEFT);

//Inits the camera to specified dimensions and sets up texture to display on screen
grabber.initGrabber(640, 480, OF_PIXELS_BGRA); //Options: 1280x720, 640x480

//Allocate opengl texture
tex.allocate(grabber.width, grabber.height, GL_RGB);

//Create pix array large enough to store an rgb value for each pixel
//pix is a global that I use to do pixel manipulation before drawing
pix = new unsigned char;
</code></pre>

<p>在更新()中</p>

<pre><code>//Loads the new pixels into the opengl texture
tex.loadData(pix, grabber.width, grabber.height, GL_RGB);
</code></pre>

<p>在draw()中:</p>

<pre><code>CGRect screenBounds = [ bounds];
CGSizeMake screenSize = CGSizeMake(screenBounds.size.width, screenBounds.size.height);

//Draws the texture we generated onto the screen
//On 1st generation iPad mini: width = 1024, height = 768
tex.draw(0, 0, screenSize.height, screenSize.width); //Reversed for 90 degree rotation
</code></pre>

<p>我在想什么:</p>

<p>1) 为什么 ofGrabber 和 ofTexture 使用看似不同的像素格式? (这些格式与 VideoGrabberExample 中使用的格式相同)</p>

<p>2) 以分辨率绘制的纹理究竟是什么?我正在将 pix 数组加载到纹理中。 pix 数组表示一个 640x480 的图像,而 ofTexture 将一个 1024x768(旋转时为 768x1024)的图像绘制到屏幕上。它是如何做到的?由于纵横比基本相同,它是否只是放大所有内容?</p>

<p>3) 是否有描述 OpenGL 和 OpenFrameworks 像素格式的列表?我已经搜索过这个,但没有找到太多。例如,为什么是 OF_PIXELS_BGRA 而不是 OF_PIXELS_RGBA?就此而言,如果我正在捕获 BGRA 格式的数据(我假设其中包含一个 Gamma 值),但我只绘制 RGB(并且您可以看到我的像素数组的大小适合 RGB 数据),为什么我的代码甚至可以工作。 </p>

<p>我可能还会提到在 main() 中我有:</p>

<pre><code>ofSetupOpenGL(screenSize.height, screenSize.width, OF_FULLSCREEN);
</code></pre>

<p>但是,更改上面的宽度/高度值似乎对我的应用没有任何影响。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><ol>
<li><p>ofGrabber 是基于 CPU 的,因此它使用 <code>OF_PIXELS_BGRA</code> 由程序员选择。某些相机通常具有 BGRA 像素顺序,因此这只是避免了抓取器在从源抓取时执行昂贵的 memcpy。 ofTexture 映射 GPU 内存,因此它映射到您将在屏幕上看到的内容 (RGB)。请注意,<code>GL_RGB</code> 是 OpenGL 定义。</p></li>
<li><p>ofTexture 确实可以缩放到您告诉它的任何内容。这是在 GPU 中完成的,因此非常便宜。它不需要具有相同的纵横比。</p></li>
<li><p>这完全取决于程序员或您的要求。有的相机提供BGRA流,有的相机或文件直接提供RGB,甚至YUV-I420。颜色格式非常多样化。在大多数情况下,OpenFrameworks 将处理转换,查看 ofPixels 以了解它的使用位置和方式。简而言之:</p>

<ul>
<li>OF_PIXELS_XXX : 由 ofPixels 使用,基本上是 RAM 映射位图</li>
<li>OF_IMAGE_XXX :由 ofImage 使用,它封装了 ofPixels 并使其更易于使用</li>
<li>GL_XXX :由 OpenGL 和 ofTexture 使用,低级 GPU 内存映射</li>
</ul></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ofGrabber和ofTexture的像素格式关系,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23328011/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23328011/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ofGrabber和ofTexture的像素格式关系