Я пытаюсь сделать небольшую сцену в кубическую карту, чтобы использовать ее для отражений в WebGL — используя Emscripten (С ++ в JavaScript). Мой код просто проходит через 6 граней и отображает все объекты на текущей стороне кубической текстуры. Код работает на настольной сборке, ошибок нет. Но WebGL говорит:
RENDER WARNING: нет текстуры, привязанной к юниту 0.
Также я получаю ошибку 1282 после проверки с помощью glGetError (); когда я называю «glDrawElements». Оба сообщения появляются 30 раз (рендеринг 5 мешей в 6 граней — 6 * 5 = 30)
FBO & создание текстуры
glGenFramebuffers(1, &m_FboId);
glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);
glGenTextures(1, &m_glId);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_glId);
for (unsigned int i = 0; i < 6; i++)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, CUBEMAP_SIZE, CUBEMAP_SIZE, 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
#if !WEB
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // Wrap_R is invalid in WebGL
#endif
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glGenRenderbuffers(1, &m_DepthId);
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, CUBEMAP_SIZE, CUBEMAP_SIZE);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthId);
m_DrawBuffers[0] = GL_COLOR_ATTACHMENT0;
glDrawBuffers(1, m_DrawBuffers);
int fbo_Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (fbo_Status != GL_FRAMEBUFFER_COMPLETE) printf(" ::ENGINE:: FBO Creation Failed! glError: %i\n", fbo_Status);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Rendering:
glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);
glViewport(0, 0, CUBEMAP_SIZE, CUBEMAP_SIZE);
Object* objectPtr;
shader.bind();
shader.loadProjectionMtx(math::perspective(90.0f, 1.0f, 0.001f, 300.0f)[0][0]);
shader.loadCameraPosition(m_Position.x, m_Position.y, m_Position.z);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
math::mat4 viewMtx(1.0f);
for (unsigned int f = 0; f < 6; f++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, m_glId, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (f == 2)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3( 0.0f, -1.0f, 0.0f), math::vec3(0.0f, 0.0f, 1.0f));
else if (f == 1)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3( 1.0f, 0.0f, 0.0f), math::vec3(0.0f, -1.0f, 0.0f));
else if (f == 4)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3( 0.0f, 0.0f, -1.0f), math::vec3(0.0f, -1.0f, 0.0f));
else if (f == 3)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3( 0.0f, 1.0f, 0.0f), math::vec3(0.0f, 0.0f, -1.0f));
else if (f == 0)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3(-1.0f, 0.0f, 0.0f), math::vec3(0.0f, -1.0f, 0.0f));
else if (f == 5)
viewMtx = math::lookAt(m_Position, m_Position - math::vec3( 0.0f, 0.0f, 1.0f), math::vec3(0.0f, -1.0f, 0.0f));
shader.loadViewMtx(viewMtx[0][0]);
for (unsigned int i = 0; i < m_Entities.size(); i++)
{
shader.loadModelMtx(m_Entities[i]->getMtx()[0][0]);
objectPtr = static_cast<Object*>(m_Entities[i]);
for (int t = 0; t < 3; t++)
{
glActiveTexture(GL_TEXTURE0 + t);
glBindTexture(GL_TEXTURE_2D, objectPtr->getTextureId(t));
glUniform1i(objectPtr->getUniformLoc(t), t);
}
glBindVertexArray(objectPtr->getMesh()->getVao());
int error = glGetError();
glDrawElements(GL_TRIANGLES, objectPtr->getMesh()->getNumberOfIndices(), GL_UNSIGNED_SHORT, 0);
error = glGetError(); if (error != 0) printf("GL ERROR: %i\n", error);
glBindVertexArray(0);
}
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Что я сделал здесь, что WebGL не нравится? Именно так я рендерил свою сцену, когда я просто рендерил ее на 2D-текстуру в другое FBO. Разница лишь в том, что на этот раз я рендеринг в текстуру куба.
Задача ещё не решена.
Других решений пока нет …