Предыдущие вызовы GL.Color3 заставляют мою текстуру использовать неправильные цвета - PullRequest
2 голосов
/ 09 апреля 2011

Создание 2D игры OpenGL.При рендеринге фрейма мне нужно сначала нарисовать вычисленную геометрию четырехугольников, а затем нарисовать некоторые текстурированные спрайты.Когда тело моего метода рендеринга рисует только спрайты, все работает нормально.Тем не менее, когда я пытаюсь нарисовать свои геометрические квадраты до спрайтов, текстура спрайта меняется на цвет последнего GL.Color3, использованного ранее.Как мне сказать OpenGL (ну, OpenTK) «Хорошо, мы закончили рисовать геометрию и пора переходить к спрайтам?»

Вот как выглядит код рендеринга:

        // Let's do some geometry 
        GL.Begin(BeginMode.Quads);
        GL.Color3(_dashboardBGColor);  // commenting this out makes my sprites look right

        int shakeBuffer = 100;
        GL.Vertex2(0 - shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, 0 - shakeBuffer);
        GL.Vertex2(0 - shakeBuffer, 0 - shakeBuffer);

        GL.End();

        // lets do some sprites
        GL.Begin(BeginMode.Quads);
        GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);

        float baseX = 200;
        float baseY = 200;

        GL.TexCoord2(0, 0); GL.Vertex2(baseX, baseY);
        GL.TexCoord2(1, 0); GL.Vertex2(baseX + _rockTextureWidth, baseY);
        GL.TexCoord2(1, 1); GL.Vertex2(baseX + _rockTextureWidth, baseY - _rockTextureHeight);
        GL.TexCoord2(0, 1); GL.Vertex2(baseX, baseY - _rockTextureHeight);  

        GL.End();

        GL.Flush();
        SwapBuffers();

1 Ответ

3 голосов
/ 10 апреля 2011

Режим текстурной среды по умолчанию - GL_MODULATE, что делает это, он умножает цвет текстуры на цвет вершины.

Простое решение - установить цвет вершины перед рисованием текстурированного примитива в 1,1,1,1 с помощью:

glColor4f (1,0f, 1,0f, 1,0f, 1,0f);

Другое решение состоит в том, чтобы изменить режим текстурного окружения на GL_REPLACE, который заставляет цвет текстуры заменять цвет вершины и не имеет проблемы:

glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

...