gpt4 book ai didi

java - OpenGL ES : glFrustrum at rendering time

转载 作者:行者123 更新时间:2023-11-30 03:49:08 26 4
gpt4 key购买 nike

我正在 Android 上的 3d 场景中开发相机系统。到目前为止,我使用这个初始化代码来:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.i(LOG_TAG, "onSurfaceCreated()");

TextureLibrary.loadTextures(m_context, gl);

//Set initial perspective and viewport
gl.glMatrixMode(GL10.GL_PROJECTION);
float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
float aspectRatio = 1.9541f;
gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glFrontFace(GL10.GL_CW);
gl.glCullFace(GL10.GL_BACK);

initialise();
}

但现在,我想更新渲染方法中的截锥体,以执行缩放和/或图像扭曲。然而,这似乎是截锥体更新

这是渲染代码(去除了一些多余的部分,除了通常的 Push 和 PopMatrix 之外,它不包含任何 GL 状态更改代码):

private void render(GL10 gl)
{
//Frustrum update code
gl.glMatrixMode(GL10.GL_PROJECTION);
float fov = .01f * (float) Math.tan(Math.toRadians(45.0 / 2.0));
float aspectRatio = 1.9541f;
gl.glFrustumf(-fov, fov, -fov / aspectRatio, fov / aspectRatio, 0.01f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
gl.glLoadIdentity();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

//Render all the things here!

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

如您所见,设置平截头体的 fragment 几乎完全相同,使用的值也相同。但是,当在渲染方法中调用 glFrustum 时,程序不会显示正在绘制的任何内容。我觉得这很奇怪,因为使用的值完全相同(强制纵横比时)。

视口(viewport)仍在 OnSurfaceChanged 方法中设置/更新,该方法至少被点击一次。

public void onSurfaceChanged(GL10 gl, int width, int height) {
_viewportWidth = width;
_viewportHeight = height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glViewport(0, 0, (int) _viewportWidth, (int) _viewportHeight);
gl.glMatrixMode(GL10.GL_MODELVIEW);
}

我认为这可能与 OpenGL 状态有关,但我还没有找到解决方案,我尝试了所有方法。

最佳答案

glFrustum() 与当前矩阵连接。由于您还没有执行 glLoadIdentity(),这意味着您将与之前的截锥体相乘。

关于java - OpenGL ES : glFrustrum at rendering time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14438196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com