菜鸟教程小白 发表于 2022-12-13 02:59:38

ios - OpenGLES for iOS - glBufferData() - GLuint 不适用于数据字段


                                            <p><p>我花了半天时间试图解决这个问题,但到目前为止我没有运气,所以我正在寻找一些建议和指导。</p>

<p>我正在我的 32 位 iPad3 (iOS 8) 上渲染一个球体。</p>

<pre><code>-(void) bufferVBO :(objectVertex[])objVertices :(int)objectVerticesSize
                  :(GLubyte[])vertexIndices   :(int)vertexIndicesSize
{
    ...
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexIndicesSize, vertexIndices, GL_STATIC_DRAW);
    ...
}
</code></pre>

<p>效果很好。但是,这最多只能渲染 256 个索引(因为 GLubyte 只有 8 位),所以我需要更多来渲染球体。</p>

<p>但是,当我尝试这样做时(注意第三个参数从“GLubyte”更改为“GLunit”):</p>

<pre><code>-(void) bufferVBO :(objectVertex[])objVertices :(int)objectVerticesSize
                  :(GLuint[])vertexIndices   :(int)vertexIndicesSize
{
    ...
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexIndicesSize, vertexIndices, GL_STATIC_DRAW);
    ...
}
</code></pre>

<p>这行不通。我的屏幕上没有呈现任何内容。在(Mac)桌面应用程序上,我能够传入 GLuint 以渲染我的球体没有问题。但是,在我的 32 位 iPad 3 上,什么都没有显示(除非我使用 GLubyte,它没有渲染一个只有 256 个索引的完整球体)。 </p>

<p>那么,为什么“GLuint”在传递索引数组时对 glBufferData() 不起作用?为什么只有“GLubyte”可以工作?</p>

<p>提前谢谢你。这让我发疯了。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题不在于 <code>glBufferData()</code>。您可以将 <code>GLuint</code> 值存储在缓冲区中。</p>

<p>限制是 ES 2.0 不支持 <code>GL_UNSIGNED_INT</code> 作为索引类型。来自 <a href="https://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawElements.xml" rel="noreferrer noopener nofollow">man page</a> 上 <code>glDrawElements()</code> 的“类型”参数的描述:</p>

<blockquote>
<p>Specifies the type of the values in indices. Must be GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT. </p>
</blockquote>

<p>ES 3.0 和完整的 OpenGL 支持此参数的 <code>GL_UNSIGNED_INT</code>。还有一个 ES 1.x 和 2.0 的扩展允许实现支持它:<a href="https://www.khronos.org/registry/gles/extensions/OES/OES_element_index_uint.txt" rel="noreferrer noopener nofollow">OES_element_index_uint</a> .</p>

<p>你可以在 ES 2.0 中使用 <code>GLushort</code> 类型作为索引,<code>GL_UNSIGNED_SHORT</code> 对应于 <code>glDrawElements() 的“类型”参数</code></code>。这为您提供了 65,536 个索引的范围。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - OpenGLES for iOS - glBufferData() - GLuint 不适用于数据字段,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26686731/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26686731/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - OpenGLES for iOS - glBufferData() - GLuint 不适用于数据字段