似乎我所能找到的关于OpenGL-ES的所有文档都说"OpenGL-ES就像OpenGL一样,但没有很多东西.例如,没有glBegin或glEnd."
太棒了.那么,ELSE不是什么?或者是有一个什么样的名单中?或者也许是一个移植指南?
(具体来说,我正在尝试将现有的GL应用程序移动到iPhone,尽管我不想将我的Q限制在iPhone上.)
OpenGL ES渲染循环放在我的iphone应用程序中的一个单独的线程上.除了EAGLContext的presentRenderbuffer方法失败之外,一切都很顺利.结果是一个空白的白色屏幕.当在主线程上运行相同的代码时,presentRenderbuffer会成功并正确显示图形.在单独的线程上执行OpenGL的正确方法是什么?
我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代码,我想移植到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渲染代码以利用一些功能GLKit(即异步纹理加载和由其提供的自动化GLKView/Controller).但是,似乎这些类的设计主要是为了适应使用动画循环渲染的人,而我正在使用按需渲染.另外,一些渲染是针对纹理而不是GLKView的帧缓冲,所以我是否应该只是将GLKView子类化并添加其他FBO?
这种类型的设置是否有推荐的方法?我希望有类似的东西:
preferredFramesPerSecond为0,或者只是暂停帧更新?glkViewControllerUpdate或glkView:drawInRect:方法,只需要我需要的东西.setNeedsDisplay与法线UIView一起使用以显示帧(我是否需要调用,bindDrawable因为我也将渲染到纹理?).如果这不是新API的设计,那么也许不值得努力?我希望文档比它更彻底.当API稍微"成熟"时,可能会提供更多样本......
谢谢
以下是我用于从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) 我试图在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错误的可能原因:
他们似乎没有解释为什么我收到这个错误.它让我发疯,请帮忙!
我学习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)
为什么有必要为片段着色器设置精确度?顶点着色器在没有这个的情况下工作,但片段着色器在没有此代码行的情况下不起作用(如我所见).为什么存在不同的行为?
我之前读过这篇文章,但它对我没有帮助.
我使用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()什么?
使用默认的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,我也不会收到任何错误.为什么它不起作用?如何删除此错误?