我正在尝试在iPhone上的OpenGL ES中创建一个屏幕外渲染缓冲区.我已经像这样创建了缓冲区:
glGenFramebuffersOES(1, &offscreenFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);
glGenRenderbuffersOES(1, &offscreenRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, offscreenRenderbuffer);
Run Code Online (Sandbox Code Playgroud)
但我对如何渲染存储感到困惑.Apple的文档说使用EAGLContext renderBufferStorage:fromDrawable:方法,但这似乎只适用于一个渲染缓冲区(显示的主渲染缓冲区).如果我使用普通的OpenGL函数glRenderBufferStorageOES,那么我似乎无法让它显示出来.这是代码:
// this is in the initialization section:
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);
// and this is when I'm trying to draw to it and display it:
glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);
GLfloat vc[] = {
0.0f, 0.0f, 0.0f,
10.0f, 10.0f, 10.0f,
0.0f, 0.0f, 0.0f,
-10.0f, -10.0f, -10.0f,
};
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vc);
glDrawArrays(GL_LINES, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
Run Code Online (Sandbox Code Playgroud)
这样做,屏幕上不显示任何内容.但是,如果我将对"offscreen ... Buffer"的引用切换到使用renderBufferStorage方法创建的缓冲区,则它可以正常工作.
有什么建议?
看起来GL已经成为所有游戏平台(甚至手持设备!)的主流.这已经推动了现代GPU芯片组部署到大量消费者.
这真太了不起了.
现在有了现代GPU系统,是否可以进行通用的老式图形编程(也就是说 - 使用VRAM从X rect到Y rect的blit)?(想想Amiga)或者是以顶点和像素着色器为中心的操作?
GL可以访问吗?OpenGL ES?
渲染纹理四边形是可以的,但它需要双缓冲和重新渲染整个场景.看看我是否可以避免这种情况.
我目前正在研究iPad游戏的几个着色器,似乎Apple的GLSL编译器没有做任何优化(或者很少).我可以在着色器中移动一行并将我的FPS从30降到24但我真的不知道为什么会发生这种情况.
有没有人对以下内容有任何参考:
谢谢,特里斯坦
有没有办法在iOS中使用OpenGL将UIView的内容渲染为纹理?还是CGLayer的内容?
我有一个EAGLView(取自Apple的例子),我可以使用以下代码成功转换为UIImage:
- (UIImage *)glToUIImage:(CGSize)size {
NSInteger backingWidth = size.width;
NSInteger backingHeight = size.height;
NSInteger myDataLength = backingWidth * backingHeight * 4;
// allocate array and read pixels into it.
GLuint *buffer = (GLuint *) malloc(myDataLength);
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders “upside down” so swap top to bottom into new array.
for(int y = 0; y < backingHeight / 2; y++) {
for(int x = 0; x < backingWidth; x++) {
//Swap top and bottom bytes …Run Code Online (Sandbox Code Playgroud) 对于后期处理着色器,我需要我的帧缓冲区的颜色和深度缓冲区.访问colorbuffer工作正常,但我在创建deepbuffer时遇到问题.尝试将texImage2D用于深度纹理时,我总是会收到INVALID_ENUM错误:
WebGL error INVALID_ENUM in texImage2D(TEXTURE_2D, 0, DEPTH_COMPONENT16, 1536, 502, 0, DEPTH_COMPONENT, UNSIGNED_BYTE, null)
Run Code Online (Sandbox Code Playgroud)
使用渲染缓冲而不是纹理工作,但我想要纹理深度,所以我可以将它传递给着色器.
帧缓冲与深度纹理代码:
Framebuffer.prototype.initBufferStuffTexture = function(width, height){
if(this.width == width && this.height == height){
return;
}
this.width = width;
this.height = height;
// remove existing buffers
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
if(this.texture != null){
gl.deleteTexture(this.texture.glid);
this.texture = null;
}
if(this.renderbuffer != null){
gl.deleteRenderbuffer(this.renderbuffer);
this.renderbuffer = null;
}
if(this.framebuffer != null){
gl.deleteFramebuffer(this.framebuffer);
this.framebuffer = null;
}
// create new buffers
this.framebuffer = gl.createFramebuffer();
this.texture = new Texture();
this.texture.glid = gl.createTexture();
this.depth …Run Code Online (Sandbox Code Playgroud) 从我读过的东西,看来OpenGL ES 2.0的不是东西,比如OpenGL 2.1,这是我从以前承担.
我很想知道的是OpenGL 3是否与OpenGL ES 2.0相当.换句话说,鉴于我即将为桌面和Android制作游戏引擎,我是否应该特别注意OpenGL 3.x +和OpenGL ES 2.0?
这也可以包括OpenGL 4.x版本.
例如,如果我开始读这本书,我在浪费我的时间,如果我打算端口发动机的Android(当然使用NDK;))?
应用程序在presentFrameBuffer中崩溃(在前台运行时,不会发生中断).
它没有在第一帧崩溃,它画了一段时间然后它突然崩溃了.
我没有重复的确切步骤,但似乎与绘制某些特定内容有关,但我仍然没有通过应用程序报告openGL错误,包括在presentFrameBuffer之前的一个错误检查.如果我在glFinish中将presentFrameBuffer崩溃之前添加glFinish.
应用程序崩溃与EXC_BAD_ACCESS(代码= 1,地址= 0x1)和上面的调用堆栈没有任何其他错误/日志/调试信息.
这是崩溃时报告的callstack:
线程1,队列:com.apple.main-thread
> #0 0x36871e46 in gpus_ReturnGuiltyForHardwareRestart ()
> #1 0x36872764 in gpusSubmitDataBuffers ()
> #2 0x31eae624 in SubmitPacketsIfAny ()
> #3 0x378a337a in gliPresentViewES ()
> #4 0x325b6df2 in -[EAGLContext presentRenderbuffer:] ()
> #5 0x0052986e in EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) ()
> #6 0x000e2a48 in -[EAGLView presentFramebuffer] at /svn/src_svn/GG/iphone/Classes/EAGLView.mm:228
> #7 0x000e4066 in -[GGViewController drawFrame] at /svn/src_svn/GG/iphone/Classes/GGViewController.mm:504
> #8 0x3809ab0a in __NSFireTimer ()
> #9 0x39d36856 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
> #10 0x39d36502 in …Run Code Online (Sandbox Code Playgroud) 我一直OpenGL在iOS中工作,设置颜色,glColor4f(r,g,b,a)然后在白色上绘制我自己的颜色UIImageView.我基本上有一个刷子,然后在我的用户的触摸周围移动,然后它将颜色绘制到画布上.但这种颜色需要水涂料(如污迹颜色)
有没有人理解/知道如何获得像这个应用程序那样的水彩,以及背景UIImageView上的纹理如何?
https://itunes.apple.com/us/app/hello-watercolor/id539414526?mt=8
或结帐水漆.http://www.fiftythree.com/paper
我为此创造了一笔赏金,因为我真的很难掌握如何从正常颜色中获得如此流畅的颜色.即使你们指的是我正确的方向,或者一些示例代码,我将如何获得效果water-paint,这将是非常有帮助的^ _ ^
作为奖励,如果你能指出我如何画出看起来真实的画布并与油漆混合,那么它也会有所帮助?是否Blending/GLSL有任何这做什么?
这有什么示例项目吗?
我正试图在我的应用程序中绘制透明纹理(文本).奇怪的是,它适用于最新的Nexus 7和我的第二代Moto X,但在最初的Nexus 7上,纹理只是黑色.我已启用混合,纹理为512x512,因此它不是二次幂的问题.我也只是使用GL10,应该支持所有东西,对吗?纹理不能仅仅在这个设备上工作的任何原因?
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_TEXTURE_2D);
// text drawn here
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glDisable(GL10.GL_BLEND);
Run Code Online (Sandbox Code Playgroud)
这是纹理初始化,我加载纹理图集:
public void loadGlyphs(GL10 gl, Context context) {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.text_bitmap);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}
Run Code Online (Sandbox Code Playgroud)
Top显示旧Nexus 7上发生的情况.底部图片是Moto X.


编辑:这是一个完整的例子.没有透明度,不会在旧的Nexus 7上绘制任何东西.如果我摆脱纹理的东西,它就像它应该的那样绘制白色的正方形.
MainActivity.java
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class MainActivity extends Activity {
private GLSurfaceView glView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
glView = new TestView(this);
setContentView(glView);
}
@Override …Run Code Online (Sandbox Code Playgroud)