将生成的ID的glGenTextures(...),glGenFramebuffers(...)永远是0?更具体地说,我可以使用零作为未初始化纹理的id,还是需要使用-1?
我正在尝试替换gl_FragDepthOpenGL ES 2.0中缺少的OpenGL功能.
我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置它对于我的目的来说不够准确.AFAIK唯一的方法是使用渲染到纹理的帧缓冲区,在其上完成第一个渲染过程.该深度纹理存储屏幕上每个像素的深度值.然后,深度纹理附加在最终渲染过程中,因此最终渲染器知道每个像素的深度.
由于iOS> = 4.1支持GL_OES_depth_texture,我正在尝试使用GL_DEPTH_COMPONENT24或GL_DEPTH_COMPONENT16用于深度纹理.我正在使用以下调用来创建纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);
Run Code Online (Sandbox Code Playgroud)
帧缓冲区创建成功,但我不知道如何继续.我对附加到帧缓冲区的深度纹理缺乏一些基本的了解.
gl_FragColor是,即使纹理是深度纹理,仍然是RGBA值.我无法在片段着色器中设置深度,因为gl_FragDepth在OpenGL ES 2.0中缺少sampler2D?glTexImage2D来GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT16_OES还是GL_DEPTH_COMPONENT24_OES?GL_DEPTH_ATTACHMENT?是否正确?如果我改变它GL_COLOR_ATTACHMENT0,我得到一个不完整的帧缓冲.stackoverflowers和其他好人,我有一个问题,经过两天的尝试我不知道如何解决:我有libgdx项目(我正在使用阶段和演员,但现在不重要)我添加到评论一切没用,问题很简单:
我的问题是:TextureAtlas应该在调用时加载每个页面图像,以便它在加载后影响运行?或者至少我是否可以知道它何时会运行,正常绘制?
真的谢谢你的回答!
显而易见的是这里的代码,但它很简单:
public class App extends Game {
@Override
public void create() {
Gdx.app.log( this.LOG, "Creating game" );
fpsLogger = new FPSLogger();
setScreen( new IntroScreen(this) );
}
}
Run Code Online (Sandbox Code Playgroud)
IntroScreen:
public class IntroScreen implements Screen {
@Override
public void resize(
int width,
int height )
{
super.resize( width, height );
Gdx.app.log("IntroScreen", "Resize start: " );
atlas = new TextureAtlas( Gdx.files.internal( "image-atlases/pages-info.atlas" ) );
Gdx.app.log("IntroScreen", "Resize …Run Code Online (Sandbox Code Playgroud) 在应用程序的res / values / colors.xml文件中,以#AARRGGBB格式定义了红色:
<color name="red">#ffff0000</color>
Run Code Online (Sandbox Code Playgroud)
如何将此颜色用作glClearColor和其他OpenGL ES函数的参数?例如:
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // <-- How to connect R.color.red here?
}
Run Code Online (Sandbox Code Playgroud) 08-30 14:24:14.281: D/dalvikvm(2777): GC_FOR_ALLOC freed 6319K, 41% free 9950K/16724K, paused 12ms, total 12ms
08-30 14:24:14.281: I/dalvikvm-heap(2777): Grow heap (frag case) to 13.750MB for 4194320-byte allocation
08-30 14:24:14.291: D/dalvikvm(2777): GC_FOR_ALLOC freed <1K, 17% free 14045K/16724K, paused 13ms, total 13ms
08-30 14:24:14.381: D/dalvikvm(2777): GC_FOR_ALLOC freed 5122K, 30% free 9955K/14152K, paused 12ms, total 12ms
08-30 14:24:14.381: I/dalvikvm-heap(2777): Grow heap (frag case) to 13.755MB for 4194320-byte allocation
08-30 14:24:14.391: D/dalvikvm(2777): GC_FOR_ALLOC freed <1K, 1% free 14051K/14152K, paused 13ms, total 13ms
08-30 14:24:14.451: D/dalvikvm(2777): GC_FOR_ALLOC …Run Code Online (Sandbox Code Playgroud) 我是Android上的OpenGL的新手,我读过大量记录的样本,我有点理解.但在尝试做任何复杂的事情之前,我想在黑色的bacground上绘制一个简单的2D白色矩形.没有其他的.
我坚持这个错误:call to OpenGL ES API with no current context这似乎是我从非OpenGL调用的东西Thread.问题是我不确定从OpenGL调用什么Thread.所以这是我的代码
// ==============活动================== //
public class MainActivity extends Activity {
public static String TAG = MainActivity.class.getSimpleName();
MyGLSurfaceView surface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
);
surface = new MyGLSurfaceView(this);
setContentView(surface);
}
@Override
protected void onPause() {
super.onPause();
surface.onPause();
}
@Override
protected void onResume() {
super.onResume();
surface.onResume();
}
}
Run Code Online (Sandbox Code Playgroud)
// ==================== GLSurfaceView ======================== //
public class MyGLSurfaceView extends GLSurfaceView {
MyGLSurfaceRenderer …Run Code Online (Sandbox Code Playgroud) 在调试版本中调用OpenGL之后检查OpenGL错误状态可以成为查找OpenGL代码中的错误的宝贵工具.但是在分配纹理或其他OpenGL资源时会出现内存不足等错误呢?处理或避免这些错误的最佳做法是什么?
在大多数情况下,OpenGL资源分配失败可能是致命的,所以一个程序只是试图分配合理数量的资源并希望最好吗?在不同平台上的实际项目中使用了哪种方法,例如在PC和移动平台上?
我正在尝试为NDK掌握OGLES2并坚持使用GLSL着色器.情况类似于此处已经强调的情况,但似乎背后的原因有些不同.
我有最简单的着色器.
#version 110
attribute vec3 vPosition;
void main(void)
{
gl_Position = vec4(vPosition, 1.0);
gl_FrontColor = gl_BackColor = vec4(0.3, 0.3, 0.3, 1); // ***
}
Run Code Online (Sandbox Code Playgroud)
#version 110
void main(void)
{
gl_FragColor = gl_Color;
}
Run Code Online (Sandbox Code Playgroud)
简单直接.我甚至在剪辑空间中直接定义了三角形.当我在Android 403设备上运行应用程序时***,VS源中的starred ()行会glUseProgram调用以抛出GL_INVALID_OPERATION错误(以及所有后续glGetAttribLocation调用都会执行相同操作).我可以写入gl_FragColorFS(一些硬编码vec4值),但甚至无法触及VS中的gl_FrontColor/ gl_BackColor值.
E/Adreno200-ES20(16211): <qgl2DrvAPI_glUseProgram:1344>: GL_INVALID_OPERATION
E/Adreno200-ES20(16211): <qgl2DrvAPI_glGetAttribLocation:531>: GL_INVALID_OPERATION
Run Code Online (Sandbox Code Playgroud)
我在着色器编译和链接期间检查每个可能的错误(glGetError和glGetShaderInfoLog),一切都很清楚.
当我将OGL实现切换到JOGL实现时,应用程序在Windows上正常工作(所有引导和呈现代码保持不变).我甚至可以使用包含颜色的顶点属性,完全没有问题.
有没有办法解决这个问题?我不相信Android OGLES实现那么恶心,可能我只是错过了它的一些功能 ......
我有点困惑为什么它仍然呈现。我认为您需要绑定一个顶点缓冲区对象,以便glDrawArrays知道要使用哪个顶点缓冲区。
这是我的初始化代码。
// Create and bind vertex array to store vertex attribute states.
glGenVertexArraysOES(NUM_VERTEX_ARRAYS, &m_vertexArray);
glBindVertexArrayOES(m_vertexArray);
// Create and bind vertex buffer to store vertex data.
glGenBuffers(NUM_VERTEX_BUFFERS, &m_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 36, &m_vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(VertexAttribPosition);
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(VertexAttribNormal);
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
Run Code Online (Sandbox Code Playgroud)
这是我的渲染代码。我很困惑为什么将0绑定到GL_ARRAY_BUFFER时glDrawArrays仍然可以工作。
glBindVertexArrayOES(m_vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArrayOES(0);
Run Code Online (Sandbox Code Playgroud) 我目前正在撰写论文,主题是通过三重缓冲提高WebGL的渲染性能,或者只是避免同步.我目前正在尝试了解WebGL机器何时以及为何同步,因为在一个进程中等待另一个进程,无论是内部还是外部.
我基本上想要在WebGL/OpenGL渲染管道中找出任何潜在的瓶颈.
我还没有找到一本书或任何其他具有足够详细规格的来源.任何指示或解释?
opengl-es ×10
android ×4
opengl ×2
android-ndk ×1
c++ ×1
crash ×1
depth-buffer ×1
frame-rate ×1
framebuffer ×1
glsl ×1
glsles ×1
java ×1
libgdx ×1
textures ×1
webgl ×1