gpt4 book ai didi

android - OpenGL ES 1.1 奇怪的光照问题

转载 作者:行者123 更新时间:2023-11-29 02:10:09 25 4
gpt4 key购买 nike

我正在研究我在 Android 上使用 OpenGL 照明时遇到的一个有趣问题。我正在开发一个 3D 查看器,您可以在其中添加和操作 3D 对象。您还可以设置具有不同属性的光。我在使用 Viewer 时遇到的问题是来自光源(它是点光源)的 3D 对象的高光表现异常。如果光源与相机位于完全相同的点,则高光会朝您预期的相反方向移动。 (因此,如果将对象向左移动,突出显示也会移动到对象的左边缘,而不是我所期望的右侧。)

The highlight is on the bottom left whereas i'd expect it to be on the right side

因此,为了进一步缩小问题的范围,我创建了一个小型示例应用程序,它只渲染一个正方形,然后我围绕相机位置(原点)旋转该正方形,这也是放置光线的位置。这应该会导致所有方 block 都直接面向相机,这样它们就会完全突出显示。结果看起来像这样:

Lighting

这些伪影会不会是由于投影导致边界失真而出现的?

在第一张图片中,球体和相机之间的距离约为 20 个单位,球体的大小约为 2。如果我将光线移近物体,高光看起来会好很多,就像我这样我很期待。在第二张图片中,正方形所在的半径为 25 个单位。我在 Android 3.1 上使用 OpenGL ES 1.1(因为我一直在努力让它与 ES 2.0 中的着色器一起工作)

这是我使用的一些代码:

public void onDrawFrame(GL10 gl) {
// Setting the camera
GLU.gluLookAt(gl, 0, 0, 0, 0f, 0f, -1f, 0f, 1.0f, 0.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

for (int i = 0; i < 72; i++) {
gl.glPushMatrix();
gl.glRotatef(5f * i, 0, 1, 0);
gl.glTranslatef(0, 0, -25);
draw(gl);
gl.glPopMatrix();
}
}

public void draw(GL10 gl) {
setMaterial(gl);
gl.glEnable(GL10.GL_NORMALIZE);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glFrontFace(GL10.GL_CCW);

// Enable the vertex and normal state
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, mNormalBuffer);

gl.glDrawElements(GL10.GL_TRIANGLES, mIndexBuffer.capacity(), GL10.GL_UNSIGNED_SHORT, mIndexBuffer);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);

}

// Setting the light
private void drawLights(GL10 gl) {
// Point Light
float[] position = { 0, 0, 0, 1 };
float[] diffuse = { .6f, .6f, .6f, 1f };
float[] specular = { 1, 1, 1, 1 };
float[] ambient = { .2f, .2f, .2f, 1 };

gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

gl.glLightfv(GL10.GL_LIGHT0, GL_POSITION, position, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL_DIFFUSE, diffuse, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL_AMBIENT, ambient, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL_SPECULAR, specular, 0);
}

private void setMaterial(GL10 gl) {
float shininess = 30;
float[] ambient = { 0, 0, .3f, 1 };
float[] diffuse = { 0, 0, .7f, 1 };
float[] specular = { 1, 1, 1, 1 };

gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse, 0);
gl.glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient, 0);
gl.glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular, 0);
gl.glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
}

我在开始时设置灯光,当 Activity 开始时(在 onSurfaceCreated 中)和 Material ,每次我画一个正方形。

最佳答案

第二个示例(带有方 block )中的效果是由于 OpenGL 使用的默认非本地查看器。默认情况下,眼空间 View 向量(从顶点到相机的向量,用于镜面高光计算)只是作为 (0, 0, 1)-向量,而不是归一化的顶点位置。这种近似只有在顶点位于屏幕中间时才是正确的,但随着您向屏幕边界移动得越远,它就会变得越来越不正确。

要更改此设置并让 OpenGL 使用从顶点到相机的真实矢量,只需使用 glLightModel功能,特别是

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

我不确定这是否也是您第一个问题(与球体有关)的原因,但也许可以试试。

编辑:您似乎不能在 OpenGL ES 中使用 GL_LIGHT_MODEL_LOCAL_VIEWER。在这种情况下,没有办法解决这个问题,当然,除了切换到 OpenGL ES 2.0 并自己进行所有光照计算。

关于android - OpenGL ES 1.1 奇怪的光照问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948433/

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