标签: opengl-es

什么是OpenGL-ES的"in"和"out"?(从OpenGL移植)

似乎我所能找到的关于OpenGL-ES的所有文档都说"OpenGL-ES就像OpenGL一样,但没有很多东西.例如,没有glBegin或glEnd."

太棒了.那么,ELSE不是什么?或者是有一个什么样的名单?或者也许是一个移植指南?

(具体来说,我正在尝试将现有的GL应用程序移动到iPhone,尽管我不想将我的Q限制在iPhone上.)

opengl iphone porting opengl-es

18
推荐指数
2
解决办法
6203
查看次数

如何在iphone上的单独线程上使用OpenGL ES?

OpenGL ES渲染循环放在我的iphone应用程序中的一个单独的线程上.除了EAGLContext的presentRenderbuffer方法失败之外,一切都很顺利.结果是一个空白的白色屏幕.当在主线程上运行相同的代码时,presentRenderbuffer会成功并正确显示图形.在单独的线程上执行OpenGL的正确方法是什么?

iphone multithreading opengl-es

18
推荐指数
2
解决办法
2万
查看次数

尝试附加纹理时GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT尝试创建渲染到纹理的帧缓冲区后出错.我无法弄清楚出了什么问题,非常感谢任何帮助.

编辑:修复它!工作代码:

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 768, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    glGenRenderbuffers(1, &rboID);
    glBindRenderbuffer(GL_RENDERBUFFER, rboID);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1024);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

    glGenFramebuffers(1, &backFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, backFramebuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID);
    [self checkFramebufferStatus];
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

注意:如果您的版本不起作用,请确保在每次通话后检查错误并在第一次通话之前清除错误,否则您将在此之前对错误进行错误检查.

opengl-es

18
推荐指数
1
解决办法
2万
查看次数

如何在OpenGL ES 2.0中替换glBegin()和相关函数?

我有以下OpenGL代码,我想移植到OpenGL ES 2.0:

for (surfnum=0;surfnum < surftotal;surfnum++){
    for (i=0;i<triNum[surfnum];i++){
        glBegin(GL_POLYGON);
        glNormal3fv(triArray[surfnum][i].normpt1);
        glVertex3fv(triArray[surfnum][i].pt1);
        glNormal3fv(triArray[surfnum][i].normpt2);
        glVertex3fv(triArray[surfnum][i].pt2);
        glNormal3fv(triArray[surfnum][i].normpt3);
        glVertex3fv(triArray[surfnum][i].pt3);
        glEnd();
        glFlush();
    }       
}
Run Code Online (Sandbox Code Playgroud)

OpenGL ES 2.0缺少GL_POLYGON,glNormal3fv,glVertex3fv,glEnd,glBegin等,那么如何更换这些函数呢?

PS:我在Ubuntu 10.10中通过模拟器进行此操作.

opengl-es opengl-es-2.0

18
推荐指数
2
解决办法
2万
查看次数

使用GLKit进行按需OpenGL ES渲染

我正在寻找转换我的OpenGL渲染代码以利用一些功能GLKit(即异步纹理加载和由其提供的自动化GLKView/Controller).但是,似乎这些类的设计主要是为了适应使用动画循环渲染的人,而我正在使用按需渲染.另外,一些渲染是针对纹理而不是GLKView的帧缓冲,所以我是否应该只是将GLKView子类化并添加其他FBO?

这种类型的设置是否有推荐的方法?我希望有类似的东西:

  • 将视图控制器设置preferredFramesPerSecond0,或者只是暂停帧更新?
  • 忽略glkViewControllerUpdateglkView:drawInRect:方法,只需要我需要的东西.
  • 将视图setNeedsDisplay与法线UIView一起使用以显示帧(我是否需要调用,bindDrawable因为我也将渲染到纹理?).

如果这不是新API的设计,那么也许不值得努力?我希望文档比它更彻底.当API稍微"成熟"时,可能会提供更多样本......

谢谢

opengl-es ios glkit

18
推荐指数
1
解决办法
1万
查看次数

为什么glReadPixels()在iOS 6.0中的此代码中失败?

以下是我用于从OpenGL ES场景中读取图像的代码:

-(UIImage *)getImage{

    GLint width;

    GLint height;

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);


    NSLog(@"%d %d",width,height);

    NSInteger myDataLength = width * height * 4;

    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // gl renders "upside down" so swap top to bottom into new array.
    // there's gotta be a better way, but this works.
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y < …
Run Code Online (Sandbox Code Playgroud)

opengl-es ios ios6

18
推荐指数
1
解决办法
9080
查看次数

glUniform4fv给出了GL_INVALID_OPERATION

我试图在iOS和OpenGL ES中开发一个基本游戏,但是我在制服上遇到了这个问题,这里是将值传递给我的制服的代码:

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(self.shaderProgram);

glUniformMatrix4fv(uniformModelViewProjection, 1, 0, modelViewProjectionMatrix.m);

// Get uniform center position
glUniform4fv(uniformCenterPosition, 1, centerPosition.v);
// Get uniform time position
glUniform1f(uniformTime, time);

// Set the sampler texture unit to 0
glUniform1i(uniformTexture, 0);
glDrawArrays(GL_POINTS, 0, numVertices);
Run Code Online (Sandbox Code Playgroud)

请注意,在glDseProgram之前和glDrawArrays调用之前,已经注意定位glUniform函数.通过追踪确认均匀位置也很好.以下是我在XCode中运行OpenGL ES Analyzer工具时得到的结果:

在此输入图像描述

它为glUniform4fv返回GL_INVALID_OPERATION,注意表示的值似乎是正确的.

以下是我从文档中找到的GL_INVALID_OPERATION错误的可能原因:

  • 没有当前的程序对象.
  • 着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配.
  • 此函数的有符号或无符号整数变量之一用于加载float,vec2,vec3,vec4或其数组的统一变量,或者如果使用此函数的某个浮点变量加载int,ivec2,ivec3,ivec4,unsigned int,uvec2,uvec3,uvec4或其数组的统一变量.
  • 此函数的一个有符号整数变体用于加载unsigned int,uvec2,uvec3,uvec4或其数组的统一变量.
  • 此函数的一个无符号整数变体用于加载int,ivec2,ivec3,ivec4或其数组的统一变量.
  • location是当前程序对象的无效统一位置,位置不等于-1.
  • count大于1且指示的统一变量不是数组变量.
  • 使用除glUniform1i和glUniform1iv之外的命令加载采样器.

他们似乎没有解释为什么我收到这个错误.它让我发疯,请帮忙!

iphone shader opengl-es ios

18
推荐指数
1
解决办法
4180
查看次数

为什么有必要为片段着色器设置精度?

我学习WebGL.下一个着色器工作正常:

// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}
Run Code Online (Sandbox Code Playgroud)

// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}
Run Code Online (Sandbox Code Playgroud)

为什么有必要为片段着色器设置精确度?顶点着色器在没有这个的情况下工作,但片段着色器在没有此代码行的情况下不起作用(如我所见).为什么存在不同的行为?

我之前读过这篇文章,但它对我没有帮助.

precision shader opengl-es webgl

18
推荐指数
2
解决办法
1万
查看次数

在Android/Java上安全使用glMapBufferRange()

我使用glMapBufferRange()Android上的OpenGL-ES 3.0 使用的代码如下所示:

  glBindBuffer(GL_ARRAY_BUFFER, myVertexBufferName);
  glBufferData(GL_ARRAY_BUFFER, myVertexBufferSize, null, GL_STATIC_DRAW);
  ByteBuffer mappedBuffer = (ByteBuffer)glMapBufferRange(
    GL_ARRAY_BUFFER,
    0, myVertexBufferSize,
    GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

  // [fill buffer...]

  glUnmapBuffer(GL_ARRAY_BUFFER);
Run Code Online (Sandbox Code Playgroud)

我的问题是关于向下转换的结果glMapBufferRange(),以ByteBuffer在第三行.glMapBufferRange()声明为返回一个Buffer:

public static Buffer glMapBufferRange (int target, int offset, int length, int access)

在我的测试平台上,该函数返回一个子类,ByteBuffer因此转换工作正常,但对支持OpenGL-ES 3+的所有平台或Android版本进行此假设似乎不太安全.虽然看起来很合理,但我没有找到任何保证它的文档,如果保证它似乎应该声明函数返回ByteBuffer.

使用Buffer返回的正确方法(最好是文档支持)是glMapBufferRange()什么?

java android opengl-es opengl-es-3.0

18
推荐指数
1
解决办法
1955
查看次数

用于EAGLContext的EXC_BAD_ACCESS用于EAGLContext renderbufferStorage:fromDrawable:在Cocos2d app中进行调试

使用默认的cocos2d-swift app我在我的iPad Mini 2上收到错误EXC_BAD_ACCESS:

BOOL rb_status = [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];
Run Code Online (Sandbox Code Playgroud)

但如果我尝试在没有调试的情况下启动应用程序,一切正常.如果我在任何虚拟设备上使用debug,我也不会收到任何错误.为什么它不起作用?如何删除此错误?

opengl-es objective-c ios swift cocos2d-swift

18
推荐指数
1
解决办法
4230
查看次数