我试图从我的EAGLView中显示的内容中获取UIImage.有关如何做到这一点的任何建议?
任何人都能解释一下EGL是什么以及它的作用是什么?
如何在Linux上使用EGL和OpenGL-ES?
EGL是硬件和操作系统之间的一层吗?
我试图找出原始摩托罗拉Droid的最大纹理大小.我相信G1的最大纹理大小为512,但如果有更正式的方式我会发现它会很好,所以我可以建立一个合适的瓷砖系统.
我一直在学习和制作小游戏,最近我决定尝试为Android开发游戏.
对我来说,从本机C++代码跳转到Android Java并不是那么难,但是让我头疼的是如何考虑如何将逻辑与渲染分开.
我一直在这里和其他网站上阅读:
最好不要为它创建另一个线程,因为Android肯定没有处理问题.
意思是代码是这样的:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是最好的方法.因为如果我将逻辑放在GLRenderer::onDrawFrame方法中,我不认为我会这样.据我所知,这个方法只是为了绘制,如果我把逻辑放在那里,我可能会减慢帧的速度.更不用说在我的理解中它伤害了POO的概念.
我认为使用线程可能就是这样,这就是我的计划方式:
主要活动:
public void onCreate(Bundle savedInstanceState) {
//set fullscreen, etc
GLSurfaceView view = new GLSurfaceView(this);
//Configure view
GameManager game = new GameManager();
game.start(context, view);
setContentView(view);
}
Run Code Online (Sandbox Code Playgroud)
游戏管理:
OpenGLRenderer renderer;
Boolean running;
public void start(Context context, GLSurfaceView view) {
this.renderer = new OpenGLRenderer(context);
view.setRenderer(this.renderer);
//create Texturelib, create sound system...
running = true;
//create a thread to run GameManager::update()
}
public void update(){
while(running){ …Run Code Online (Sandbox Code Playgroud) 我在我的IOS OpenGL ES 2.0项目中使用GLkit/GLKView来管理我的应用程序的默认FBO /生命周期.
在桌面OpenGL中为了绑定默认FBO(前缓冲区),我可以调用glBindFrameBuffer(GL_FRAMEBUFFER,0),但在IOS应用程序中并非如此,因为您必须自己创建默认FBO并且它将具有唯一ID;
问题是GLKit/GLKView编码风格迫使我使用GLKView的"bindDrawable"函数激活默认FBO,这使得我的跨平台渲染系统的设计有点难看(必须在我的c ++引擎类和桥中将GLKView指针存储为void*每次我想执行默认的FBO绑定时都抛出它)
有没有办法获得GLKit/GLKView创建的默认FBO ID,以便我可以存储并使用它来绑定我的代码中的任何位置的默认帧缓冲区?
在最坏的情况下,我可以恢复自己创建默认的FBO并消除GLKit/GLKView,但它是一个很好的框架,我想继续使用它.
抱歉我的英文不好,并提前感谢您的回复.
目前,我正在尝试使用openGL绘制图像(图像经常更新,因此必须重新绘制).以前,我将我的图像从YUV转换为RGB,然后使用这个新图像用openGL绘制.一切正常,但转换过程并不是特别快.
我现在正在尝试更改代码,以便在openGL着色器中处理转换.环顾四周后,我发现了一些代码片段(特别是着色器和我的renderImage函数的大部分),这些代码片段帮助我获得了基线,但我似乎无法真正得到正确绘制的图像 - 所有我曾经看是一个黑色的图像.
我很可能错过了一些非常简单和重要的东西 - 我对openGL的体验相当有限.如果有人可以看看,看看他们是否认识到任何错误,请告诉我.
我应该指出,我正在尝试支持iOS 4.x,因此CVOpenGLESTextureCacheCreateTextureFromImage不应该可用(即使我想要,我也不是很积极如何设置使用它).
任何帮助,将不胜感激.代码如下 -
我的顶点着色器:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main()
{
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 textureCoordinate;
uniform sampler2D videoFrame;
uniform sampler2D videoFrameUV;
const mat3 yuv2rgb = mat3(
1, 0, 1.2802,
1, -0.214821, -0.380589,
1, 2.127982, 0
);
void main() {
vec3 yuv = vec3(
1.1643 * (texture2D(videoFrame, textureCoordinate).r - 0.0625),
texture2D(videoFrameUV, textureCoordinate).r - 0.5,
texture2D(videoFrameUV, …Run Code Online (Sandbox Code Playgroud) libgdx SpriteBatch开始和结束方法是否对处理器来说是昂贵的,或者如果我多次调用它们会使性能变慢?
例如:
public void render(float delta) {
GL10 gl = Gdx.gl10;
gl.glClearColor(0, 0, 0, 0);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
//draw something
batch.end();
//do something before draw the others
batch.begin();
//draw others
batch.end();
//update
//controls
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中我只打了2次开始和结束.但是我想要做4到5次......这样会减慢速度吗?
我一直在尝试运行使用Android NDK在C++中使用VAO并在模拟器上运行的代码.我希望能够使用glDeleteVertexArraysOES,glGenVertexArraysOES和glBindVertexArrayOES.
我发现模拟器无法运行代码,即使我使用OpenGL ES 2并使用此解决方案动态链接扩展:Android OpenGL ES 2.0中是否支持使用扩展的顶点数组对象?
我运行glGetString(GL_EXTENSIONS)了运行API Level 19和GPU加速的Nexus 4仿真器并获得了以下信息:
GL_EXT_debug_marker
GL_OES_EGL_image
GL_OES_depth24
GL_OES_depth32
GL_OES_element_index_uint
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth_texture
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_packed_depth_stencil
GL_OES_vertex_half_float
Run Code Online (Sandbox Code Playgroud)
我假设我需要看到GL_OES_vertex_array_object才能使用顶点数组对象.因此,对于那个特定的模拟器来说,这似乎是不可取的.
你知道在任何现有的Android模拟器(第三方或其他)上是否可以在OpenGL ES中使用顶点数组对象?如果是这样,怎么样?
我有一个由一个带有ImageView的布局组成的Android项目.
public class MainActivity extends AppCompatActivity {
/* original and stretched sized bitmaps */
private Bitmap bitmapOriginal;
private Bitmap bitmapStretched;
/* the only view */
private ImageView iv;
....
}
Run Code Online (Sandbox Code Playgroud)
此ImageView由此runnable函数更新
runnable = new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmapStretched);
}
};
Run Code Online (Sandbox Code Playgroud)
runnable由一个临时JNI函数运行,在后台线程上运行,每秒调用60次.
public void jniTemporizedCallback(int buf[]) {
/* set data to original sized bitmap */
bitmapOriginal.setPixels(buf, 0, origWidth, 0, 0, origWidth, origHeight);
/* calculate the stretched one */
bitmapStretched = Bitmap.createScaledBitmap(bitmapOriginal, width, height, false);
/* tell the …Run Code Online (Sandbox Code Playgroud) 我已经看到偶尔的文章建议在将它们发送到OpenGL(对于任何OpenGL变体)时,将顶点从距离相机最近到最远的位置排序.这样做的原因是,如果顶点位于已经渲染的另一个顶点后面,OpenGL将无法完全处理/渲染顶点.
由于按深度排序顶点是任何项目的昂贵组成部分,因为这种排序通常会发生变化,这种设计有多常见或必要?
我以前认为OpenGL将"查看"提交的所有顶点,并在渲染整个批处理之前处理它们自己的深度缓冲,无论它们的顺序如何.但是,如果事实上一个顶点在另一个顶点之前被渲染到屏幕上,那么我可以看到排序如何有益于性能.
是否需要前后绘制才能优化渲染?