gpt4 book ai didi

ios - OpenGL 到 GL ES 2.0 端口 : trouble in rendering

转载 作者:行者123 更新时间:2023-11-29 02:28:45 26 4
gpt4 key购买 nike

我是 OpenGL 的新手,正在移植现有应用程序以使其在 iOS 中运行。现有的OpenGL代码如下:

glGenTextures(1, (GLuint*)&_colorTexID);
glGenTextures(1, (GLuint*)&_depthTexID);
glBindTexture(GL_TEXTURE_2D, _colorTexID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, colorFormat, colorType, getColorBuffer(_HRenderTarget));
glBindTexture(GL_TEXTURE_2D, _depthTexID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, depthFormat, depthType, getDepthBuffer(_HRenderTarget));
GLint mode[2];
GLboolean stencilMode;
GLboolean depthTestEnabled;
glGetIntegerv(GL_POLYGON_MODE, mode);
glGetBooleanv(GL_STENCIL_TEST, &stencilMode);
glGetBooleanv(GL_DEPTH_TEST, &depthTestEnabled);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glCullFace(GL_BACK);
glDisable(GL_STENCIL_TEST);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _colorTexID);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _depthTexID);
glActiveTexture(GL_TEXTURE0);
glUseProgram(getGLProgramObject());
if (_depthTest)
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
else
{
glDisable(GL_DEPTH_TEST);
}
glEnable(GL_ALPHA_TEST);
glVertexAttrib4f(glGetAttribLocation(getGLProgramObject(), "color"), 1.f, 1.f, 1.f, _alpha);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(-1, -1);
glTexCoord2f(1, 0); glVertex2f(1, -1);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(-1, 1);
glEnd();
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0);
glUseProgram(0);
// Restore states
glPolygonMode(GL_FRONT, mode[0]);
glPolygonMode(GL_BACK, mode[1]);
if (stencilMode) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST);
if (depthTestEnabled) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);

我的 GL ES 更改只是替换了即时模式四边形渲染

glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(-1, -1);
glTexCoord2f(1, 0); glVertex2f(1, -1);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(-1, 1);
glEnd();

与:

GLshort vtx1[] = {-1,-1,    1,-1,   1,1,    -1,1    };
GLshort tex1[] = { 0,0, 1,0, 1,1, 0,1, };
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_SHORT, 0, &vtx1[0]);
glTexCoordPointer(2, GL_SHORT, 0, &tex1[0]);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

GL_RGBA8 使用 GL_RGBA8_OESGL_R32F 使用 GL_R32F_EXT,并且不使用 glPolygonMode因为它不受支持。但似乎我错过了一些东西。它不会呈现并崩溃,导致错误 GPU 对硬件重启感到内疚。

我的着色器代码:

        const GLcharARB* _udFragmentShader =
" \n" \
" uniform sampler2D udTexture; \n" \
" uniform sampler2D udDepth; \n" \
" void main (void) \n" \
" { \n" \
" vec4 frag = texture2D(udTexture,gl_TexCoord[0].st); \n" \
" if(frag.a < 0.5) discard; \n" \
" gl_FragColor = frag * gl_Color; \n" \
" gl_FragDepth = (texture2D(udDepth,gl_TexCoord[0].st).r * 0.5) + 0.5; \n" \
" } \n" \
" \n" \
"";


const GLcharARB* _udVertexShader =
" \n" \
" attribute vec4 color; \n" \
" void main(void) \n" \
" { \n" \
" gl_Position = gl_Vertex; \n" \
" gl_FrontColor = color; \n" \
" gl_TexCoord[0] = gl_MultiTexCoord0; \n" \
" } \n" \
" \n" \
"";

最佳答案

您正在尝试混合使用 OpenGL ES 1.x 和 ES 2.0。 ES 2.0 不是 ES 1.x 的扩展。 ES 2.0 是一个全新的 API 定义,与 ES 1.x 几乎没有共同之处。如果您查看官方规范文件 ( https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/gl.xml ),也可以确认这一点:

<feature api="gles1" name="GL_VERSION_ES_CM_1_0" number="1.0">
...
<feature api="gles2" name="GL_ES_VERSION_2_0" number="2.0">
...
<feature api="gles2" name="GL_ES_VERSION_3_0" number="3.0">
...
<feature api="gles2" name="GL_ES_VERSION_3_1" number="3.1">
...

可以看到 ES 3.0 和 3.1 被指定为 gles2 API 的扩展,而 ES 2.0 被指定为带有 gles1 的新 API。因此,它根本不向后兼容 ES 1.x。

这意味着您必须使用 ES 1.1 或 ES 2.0:

  • ES 1.1 非常有限。最重要的是,它不支持带有 GLSL 着色器的可编程管线。我也认为它在这一点上已经过时了。
  • ES 2.0 消除了所有固定功能特性,只有可编程管道。

如果您坚持使用 ES 2.0(恕我直言,您应该这样做),您将不得不摆脱所有不再可用的调用。快速查看您的代码,这包括:

  • GL_ALPHA_TEST:如果您确实需要,请在片段着色器中替换为 discard
  • GL_QUADS 基本类型:替换为GL_TRIANGLESGL_TRIANGLE_STRIP
  • 即时模式渲染(glBegin() 等):替换为顶点数组/缓冲区和 glDrawArrays()glDrawElements()
  • glEnableClientState():替换为 glEnableVertexAttribArray()
  • glVertexPointer(), glTexCoordPointer():替换为 glVertexAttribPointer()

理想情况下,您应该避免在使用 ES 2.0 时包含任何 ES 1.x header 。这将允许您在编译时看到大部分不兼容,因为 ES 2.0 中不可用的函数/枚举将不再定义,从而导致构建错误。

关于ios - OpenGL 到 GL ES 2.0 端口 : trouble in rendering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com