Opengl es 制作平面OpenGL曲面以应用纹理:我的代码中的奇怪行为(添加图片以供参考)

Opengl es 制作平面OpenGL曲面以应用纹理:我的代码中的奇怪行为(添加图片以供参考),opengl-es,Opengl Es,我有一个非常简单的AR应用程序,其中有一个我检测到的标记,然后在这个标记上,我创建一个openGL平面,并对其应用纹理。我现在用的是一个简单的正方形。代码如下所示: #define NUM_SURFACE_OBJECT_VERTEX 12 #define NUM_SURFACE_OBJECT_INDEX 12 static const float surfaceVertices[] = { 20, -20, 5, 20, 20, 5, -20, 20, 5,

我有一个非常简单的AR应用程序,其中有一个我检测到的标记,然后在这个标记上,我创建一个openGL平面,并对其应用纹理。我现在用的是一个简单的正方形。代码如下所示:

#define NUM_SURFACE_OBJECT_VERTEX 12
#define NUM_SURFACE_OBJECT_INDEX 12

static const float surfaceVertices[] =
{
     20, -20, 5, 
     20,  20, 5,
    -20,  20, 5, 
    -20, -20, 5
};

static const float surfaceTexCoords[] =
{
    1, 0,
    1, 1,
    0, 1,
    0, 0
};

static const float surfaceNormals[] =
{

};

static const unsigned short surfaceIndices[] =
{
    0, 1, 2,
    2, 3, 0
};
QCAR::Matrix44F modelViewProjection;

ShaderUtils::translatePoseMatrix(
    0.0f, 0.0f, kObjectScale, &modelViewMatrix.data[0]);

ShaderUtils::scalePoseMatrix(
    kObjectScale,
    kObjectScale,
    kObjectScale,
    &modelViewMatrix.data[0]);

ShaderUtils::multiplyMatrix(
    &projectionMatrix.data[0],
    &modelViewMatrix.data[0],
    &modelViewProjection.data[0]);

glUseProgram(shaderProgramID);

glVertexAttribPointer(
    vertexHandle,
    3,
    GL_FLOAT,
    GL_FALSE,
    0,
    (const GLvoid*)&surfaceVertices[0]);

glVertexAttribPointer(
    textureCoordHandle,
    2,
    GL_FLOAT,
    GL_FALSE,
    0,
    (const GLvoid*)&surfaceTexCoords[0]);

glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(textureCoordHandle);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [thisTexture textureID]);
glUniformMatrix4fv(
    mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);

glDrawElements(
    GL_TRIANGLES,
    NUM_SURFACE_OBJECT_INDEX,
    GL_UNSIGNED_SHORT,
    (const GLvoid*)&surfaceIndices[0]);

ShaderUtils::checkGlError("EAGLView renderFrameQCAR");
绘制它的代码如下所示:

#define NUM_SURFACE_OBJECT_VERTEX 12
#define NUM_SURFACE_OBJECT_INDEX 12

static const float surfaceVertices[] =
{
     20, -20, 5, 
     20,  20, 5,
    -20,  20, 5, 
    -20, -20, 5
};

static const float surfaceTexCoords[] =
{
    1, 0,
    1, 1,
    0, 1,
    0, 0
};

static const float surfaceNormals[] =
{

};

static const unsigned short surfaceIndices[] =
{
    0, 1, 2,
    2, 3, 0
};
QCAR::Matrix44F modelViewProjection;

ShaderUtils::translatePoseMatrix(
    0.0f, 0.0f, kObjectScale, &modelViewMatrix.data[0]);

ShaderUtils::scalePoseMatrix(
    kObjectScale,
    kObjectScale,
    kObjectScale,
    &modelViewMatrix.data[0]);

ShaderUtils::multiplyMatrix(
    &projectionMatrix.data[0],
    &modelViewMatrix.data[0],
    &modelViewProjection.data[0]);

glUseProgram(shaderProgramID);

glVertexAttribPointer(
    vertexHandle,
    3,
    GL_FLOAT,
    GL_FALSE,
    0,
    (const GLvoid*)&surfaceVertices[0]);

glVertexAttribPointer(
    textureCoordHandle,
    2,
    GL_FLOAT,
    GL_FALSE,
    0,
    (const GLvoid*)&surfaceTexCoords[0]);

glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(textureCoordHandle);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [thisTexture textureID]);
glUniformMatrix4fv(
    mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);

glDrawElements(
    GL_TRIANGLES,
    NUM_SURFACE_OBJECT_INDEX,
    GL_UNSIGNED_SHORT,
    (const GLvoid*)&surfaceIndices[0]);

ShaderUtils::checkGlError("EAGLView renderFrameQCAR");
这是我正在旋转的一组测试纹理(实际上,所有的png都是一样的,我只是复制了多次。它们的大小都是512x512px):

如果显示的代码段不正确,我深表歉意,但这是程序的绘图部分。从本质上说,这是我试图解决的示例代码,我刚刚用平面和纹理替换了他们使用的茶壶模型

因此,有几点需要注意:

  • 出于某种原因,当我使用上面的代码时,只有1到5个纹理,一切都很好。我可以正常地看到纹理,并且可以移动相机以查看不同的透视图。我有一个功能,每10秒更改一次纹理,当只使用一些纹理时,一切仍然正常
  • 当使用更多的东西时,比如说在10种或更多不同的纹理之间旋转,我开始有奇怪的行为,比如一个从屏幕向外突出的平面。
  • 如果你注意到我上面的代码,我注释掉了任何使用法线的东西。实际上,我不知道平面的法线数组是什么样子,所以我只是试着注释掉所有代码
  • 我上传了一些图片供参考:

    这是背景中的标记(一些木屑)和应用于表面的纹理的快照。一切似乎都好

    这是一张角度拍摄的照片。此时,我只在代码中的5个纹理之间旋转。这里一切都好

    现在,我试着每10秒旋转10个纹理。即使在第一个纹理上,我也会得到一个奇怪的平面,像这样突出:

    为什么会这样?示例代码在加载纹理时没有给我任何警告,我甚至尝试使纹理非常小,但仍然是相同的行为。我声明顶点和索引的方式有问题吗?是因为我忽略了法线吗

    谢谢大家!

    澄清


    这些照片是从我的iPad2上拍摄的。我的AR应用程序正在我的iPad2上运行。我正在用我的macbook air来显示木片的标记。因此,我的ipad正在识别macbook air上显示的标记图像,并在标记顶部应用纹理

    通过添加法向量,它似乎是固定的

    通过添加法向量,它似乎是固定的

    我对最后一张图片有点困惑。这是一张从相机上拍摄的电脑照片,还是台灯是你的纹理的一部分?因为如果它是从照相机上拍摄的。。。那么,你的电脑不知何故正在将多边形泄漏到现实世界中……这张图片是我在ipad 2上运行的AR应用程序中看到的屏幕截图我对最后一张图片有点困惑。这是一张从相机上拍摄的电脑照片,还是台灯是你的纹理的一部分?因为如果它是从照相机上拍摄的。。。那么,你的电脑不知何故正在将多边形泄漏到现实世界中……这张图片是我在ipad 2上运行的AR应用程序中看到的屏幕截图