opengl — многотекстурное переполнение стека GLBatch

Я работаю над пятой редакцией супербиблии OpenGL и пытаюсь использовать несколько текстур с одним объектом glbatch. Однако я не могу получить что-либо больше, чем одну текстуру для рендеринга, и области, которые я указал для рендеринга с текстурами 2 и 3, просто становятся серыми по умолчанию. В настоящее время я просто рендеринг куба с различной текстурой на каждом лице, без смешивания и необычной интерполяции.

Я видел темы на форумах, утверждающие, что glbatch может легко поддерживать несколько текстур, это правда? если так то что мне не хватает? или это что-то, что потребовало бы от меня написания маленького шейдера, поскольку единственный мультитекстурный пример, который я мог найти, использовал небольшой пользовательский шейдер (который, однако, был примером отражения, поэтому он был довольно сложным для начала), если бы кто-то мог указать мне на Направление того, как начать писать указанный шейдер.

Также я использую GLShaderManager со стандартным шейдером ‘GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF’. Я не уверен, что это моя проблема, поддерживает ли этот шейдер более одной текстуры?

Код:

GLBatch               cubeBatch;

GLuint                TEXID_Tex0;
GLuint                TEXID_Tex1;
GLuint                TEXID_Tex2;

// The initialization
void SetupRC()
{
// Turn on Culling
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

// Light Gray Background
glClearColor(0.8f, 0.8f, 0.8f, 1.0f);

shaderManager.InitializeStockShaders();

// Load textures
glGenTextures(1, &TEXID_Tex0);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex0);
LoadTGATexture("Texture1.tga", GL_LINEAR, GL_LINEAR, GL_REPEAT);

glGenTextures(1, &TEXID_Tex1);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex1);
LoadTGATexture("Texture2.tga", GL_LINEAR, GL_LINEAR, GL_REPEAT);

glGenTextures(1, &TEXID_Tex2);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex2);
LoadTGATexture("Texture3.tga", GL_LINEAR, GL_LINEAR, GL_REPEAT);

// Set the textures to their texture units
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex2);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, TEXID_Tex0);

// Fill the cube batch with data
CreateCube(cubeBatch);

// Move the camera up a bit
cameraFrame.MoveForward(-7.0f);
}

void CreateCube(GLBatch& cubeBatch)
{
// Start the batch
cubeBatch.Begin(GL_TRIANGLES, 18, 3);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 1.0f, 1.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 1.0f, 0.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 0.0f, 0.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 1.0f, 1.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 0.0f, 0.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);

cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);
cubeBatch.MultiTexCoord2f(1, 0.0f, 1.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);

cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);

cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);

cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 0.0f, 0.0f);
cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);

cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 1.0f, 0.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f);

cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 1.0f, 1.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 1.0f, 1.0f);
cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);

cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 0.0f, 1.0f);
cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);

cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);
cubeBatch.MultiTexCoord2f(2, 0.0f, 0.0f);
cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);

cubeBatch.End();
}

void RenderScene(void)
{
static GLfloat vLightPos [] = { 1.0f, 1.0f, 0.0f };
static GLfloat vWhite [] = { 1.0f, 1.0f, 1.0f, 1.0f };

// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

modelViewMatrix.PushMatrix();
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);

M3DMatrix44f mObjectFrame;
objectFrame.GetMatrix(mObjectFrame);
modelViewMatrix.MultMatrix(mObjectFrame);

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(),
vLightPos, vWhite, 0);

glEnable(GL_CULL_FACE);
cubeBatch.Draw();
glDisable(GL_CULL_FACE);

modelViewMatrix.PopMatrix();

// Flush drawing commands
glutSwapBuffers();
}

bool LoadTGATexture(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode)
{
GLbyte *pBits;
int nWidth, nHeight, nComponents;
GLenum eFormat;

// Read the texture bits
pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
if(pBits == NULL)
return false;

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0,
eFormat, GL_UNSIGNED_BYTE, pBits);

free(pBits);

if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||
minFilter == GL_LINEAR_MIPMAP_NEAREST ||
minFilter == GL_NEAREST_MIPMAP_LINEAR ||
minFilter == GL_NEAREST_MIPMAP_NEAREST)
glGenerateMipmap(GL_TEXTURE_2D);

return true;
}

Единственное, что не включено, это объявления таких вещей, как матричные стеки и фреймы, а также функции misc для изменения размера и обработки движения мыши.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]