【问题标题】:Open GLES 1.1 - GLColorPointer creates a rainbow of colours when I just want red打开 GLES 1.1 - 当我只想要红色时,GLColorPointer 会创建彩虹般的颜色
【发布时间】:2011-03-09 18:48:07
【问题描述】:

我正在渲染这样的对象:

for (int i = 0; i < COLOR_ARRAY_SIZE; i += 4) {
    colors[i] = 1.0f;
    colors[i + 1] = 0.0f;
    colors[i + 2] = 0.0f;
    colors[i + 3] = 1.0f;
}

// Clear color and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Set GL11 flags:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glEnable(GL_DEPTH_TEST);

// make sure nothing messes with the colour
glDisable(GL_BLEND);
glDisable(GL_DITHER);
glDisable(GL_FOG);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);

// Load projection matrix:
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projectionMatrix);

// Load model view matrix and scale appropriately
int kObjectScale = 300f;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(modelViewMatrix);
glTranslatef(0.5f, 0.5f, 0.5f);
glScalef(kObjectScale, kObjectScale, kObjectScale);

// Draw object
glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*) &vertexPositions[0]);
glNormalPointer(GL_FLOAT, 0, (const GLvoid*) &vertexNormals[0]);
glColorPointer(4, GL_FLOAT, 0, (const GLvoid*) &colors[0]);
glDrawElements(GL_TRIANGLES, 11733, GL_UNSIGNED_SHORT,
        (const GLvoid*) &indices[0]);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

我希望这会将我的对象全部呈现为红色,但它是不同颜色的彩虹。有谁知道为什么?我会假设我的“颜色”数组缓冲区有问题,但我一辈子都看不到它是什么。实际的顶点似乎渲染得很好。

【问题讨论】:

    标签: opengl-es colors


    【解决方案1】:

    您的 for 循环非常混乱。您每次将 i 的值增加 4。更重要的是,您在第 3-5 行中使用偏移量 1、2 和 3 进行索引。我假设您对 COLOR_ARRAY_SIZE 的定义是 4?尝试按如下方式初始化颜色数组:

    float colors[] = {1.0f, 0.0f, 0.0f, 1.0f};

    然后调用glColorPointer如下:

    glColorPointer(4, GL_FLOAT, 0, colors);

    请注意,我已将步幅设置为 0。如果您的颜色数组仅包含颜色,那么我看不出您应该使用步幅的任何理由(步幅用于跳过数组中的交织信息) .

    【讨论】:

    • 我在试验时不小心将步幅设置为 1,但在发布之前忘记更改它,抱歉 - 我会更改它。我以这种方式填充颜色数组,以便获得一个 R、G、B、A 值的缓冲区,这些值代表每个顶点的红色。我这样做是为了调试为什么我的颜色一团糟。最终,我想将这个“红色”缓冲区换成我的真实颜色数组。 COLOR_ARRAY_SIZE == 15644。
    • 应该可以吗?我将步幅改回 0 并且仍然获得多色效果。用 1.0,0.0,0.0,1.0 填充我的数组肯定会让每个顶点都变红吗?
    • 如果您编辑了您在问题中发布的代码,那么 for 循环对我来说仍然看起来很狡猾!为什么你每次都增加 4,然后用偏移量索引你的数组?您是否尝试过按照我的建议声明您的数组?
    • 我确实尝试按照您的建议进行设置,但应用程序在我身上崩溃了,大概是因为顶点数量超过了“颜色”数组所能提供的数量。
    • 当我用所有 1.0f 值填充数组时,它变成了全白色,所以我需要一些不同颜色的东西。我不知道如何用 1.0f,0.0f,0.0f,1.0f 连续填充数组?我现在正在考虑使用 Open GL ES 2.0,情况似乎正在好转(我最初被自己做的灯光吓到了)。不过,谢谢你的帮助。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多