OpenGL портируется на XNA - PullRequest
       27

OpenGL портируется на XNA

1 голос
/ 20 сентября 2010

Я начинаю переносить свою игру на XNA из кодовой базы C / OpenGL. Я только сейчас перехожу к коду рендеринга, и мне интересно, какими будут лучшие методы для перехода из системы, в которой вы просто связываете текстуру одним вызовом, а затем выводите объекты буфера вершин в эквивалентный набор методов XNA? Я могу видеть, как вы передаете данные вершин, но я не совсем уверен, как вы связываете текстуру. Все это должно быть сделано в шейдерах, или в XNA есть простая процедура?

Мой основной код рендеринга для моделей выглядит следующим образом (я прошу прощения за небольшие имена переменных)

glEnable(GL_TEXTURE_2D);
glEnable(GL_CULL_FACE);

glBindTexture(GL_TEXTURE_2D, obj->tx);

glColor4f(c.r, c.g, c.b, c.a);

glBindBuffer(GL_ARRAY_BUFFER, obj->iVBO);
glVertexPointer(3, GL_FLOAT, (sizeof(float) * 3) + (sizeof(float) * 2), 0);
glTexCoordPointer(2, GL_FLOAT, (sizeof(float) * 3) + (sizeof(float) * 2), (const GLvoid*)(4 * 3));
glDrawArrays(GL_TRIANGLES, 0, obj->iSize);
glBindBuffer(GL_ARRAY_BUFFER, 0);

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Из документации MSDN здесь , вот как вы связываете текстуру (фактически две):

graphics.GraphicsDevice.Textures[0] = firstTexture;
graphics.GraphicsDevice.Textures[1] = secondTexture;

А затем вы устанавливаете свои вершинные и индексные буферы (по мере необходимости) к устройству со свойством Indices и методом SetVertexBuffer() соответственно.Затем вы рисуете их одним из методов GraphicsDevice.Draw*().

Если вы просто визуализируете модели, то вы можете захотеть взглянуть на класс Model (который будет обрабатывать такие вещи для вас,включая импорт моделей через конвейер содержимого).

Кроме того, если вы используете BasicEffect, он также имеет элемент Texture, который можно использовать для обработки текстур.

0 голосов
/ 20 сентября 2010

Обычно вы привязываете текстуры к устройству, используя свойство GraphicsDevice.Textures.Пример кода использует XNA 4.0.Порт вашего кода будет выглядеть примерно так:

        GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
        GraphicsDevice.Textures[0] = obj.tx;
        GraphicsDevice.SetVertexBuffer(obj.iVBO);

        effectColorParameter.SetValue(c.ToVector4());
        effect.CurrentTechnique.Passes[0].Apply();

        GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, obj.triangleCount);
        GraphicsDevice.SetVertexBuffer(null);

Или если вы хотите использовать базовый эффект, вы привязываете текстуру непосредственно к эффекту.

...