Использование необъявленного идентификатора GluBuildMipMaps (emscripten)

Я создал программу OpenGL, используя SDL. Я пытался скомпилировать в HTML5 + JS с помощью emscripten, но я получаю эту ошибку:

ошибка emscripten

Я не могу понять, почему я получаю эту ошибку. GluBuildMipMaps определяется в glu.h: https://github.com/kripken/emscripten/blob/master/system/include/GL/glu.h

Ошибки GLM также сбивают с толку, потому что я скопировал библиотеку GLM в glm каталог, и он включен, где я его использую.


редактировать

Сообщение об ошибке в виде простого текста:

D:\proj\e_bead>emcc main.cpp MyApp.cpp ObjParser_OGL3.cpp -s FULL_ES2=1 -O3 --me
mory-init-file 0
In file included from MyApp.cpp:2:
./GLUtils.hpp:148:2: error: use of undeclared identifier 'gluBuild2DMipmaps'
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, loaded_img->w, loaded_i...
^
MyApp.cpp:194:25: error: no matching function for call to 'translate'
...spaceShipTransform = glm::translate<float>(randnum, randnum, randnum);
^~~~~~~~~~~~~~~~~~~~~
./glm/gtc/matrix_transform.inl:40:35: note: candidate function template not
viable: requires 2 arguments, but 3 were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate
^
./glm/gtx/transform.inl:36:35: note: candidate function template not viable:
requires single argument 'v', but 3 arguments were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(
^
MyApp.cpp:199:25: error: no matching function for call to 'translate'
...spaceShipTransform = glm::translate<float>(randnum, randnum, randnum);
^~~~~~~~~~~~~~~~~~~~~
./glm/gtc/matrix_transform.inl:40:35: note: candidate function template not
viable: requires 2 arguments, but 3 were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate
^
./glm/gtx/transform.inl:36:35: note: candidate function template not viable:
requires single argument 'v', but 3 arguments were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(
^
MyApp.cpp:234:9: error: no matching function for call to 'translate'
mvp *= glm::translate(0.0f, 5.0f, 0.0f);
^~~~~~~~~~~~~~
./glm/gtc/matrix_transform.inl:40:35: note: candidate function template not
viable: requires 2 arguments, but 3 were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate
^
./glm/gtx/transform.inl:36:35: note: candidate function template not viable:
requires single argument 'v', but 3 arguments were provided
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(
^
4 errors generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting

Edit2

Я скопировал glm библиотека в каталог glm, и включите его с этим кодом:

// GLM
#include "glm/glm.hpp"#include "glm/gtc/matrix_transform.hpp"#include "glm/gtx/transform2.hpp"

Код загрузки текстуры, где gluBuild2DMipmaps называется:

GLuint TextureFromFile(const char* filename)
{
SDL_Surface* loaded_img = IMG_Load(filename);

int img_mode = 0;

if ( loaded_img == 0 )
{
std::cout << "[TextureFromFile] Error when loading image: " << filename << std::endl;
return 0;
}

#if SDL_BYTEORDER == SDL_LIL_ENDIAN
if ( loaded_img->format->BytesPerPixel == 4 )
img_mode = GL_BGRA;
else
img_mode = GL_BGR;
#else
if ( loaded_img->format->BytesPerPixel == 4 )
img_mode = GL_RGBA;
else
img_mode = GL_RGB;
#endif

GLuint tex;
glGenTextures(1, &tex);

glBindTexture(GL_TEXTURE_2D, tex);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, loaded_img->w, loaded_img->h, img_mode, GL_UNSIGNED_BYTE, loaded_img->pixels);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

SDL_FreeSurface( loaded_img );

return tex;
}

Edit3

Я редактировал GLUtils.hpp в соответствии с Robert Rouhaniответ, и теперь я не получаю ошибку компиляции в этой строке:

glBindTexture(GL_TEXTURE_2D, tex);
//gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, loaded_img->w, loaded_img->h, img_mode, GL_UNSIGNED_BYTE, loaded_img->pixels);

glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
loaded_img->w,
loaded_img->h,
0,
img_mode,
GL_UNSIGNED_BYTE,
loaded_img->pixels);
glGenerateMipmap(GL_TEXTURE_2D); // /!\ Allocate the mipmaps /!\

2

Решение

Я не слишком знаком с emscripten, но из некоторых поисков это выглядит как ваш вариант FULL_ES2=1 означает, что вы получаете весь API OpenGL ES 2.0. Я предполагаю, что это означает, что единственный каталог, который вы получаете, это GLES2 вместо GL, папка, содержащая glu.h что вы связаны с.

GLU уже почти 20 лет, и он работал только до OpenGL 1.3 (выпущен в 2001 году). Это означает, что вы не можете использовать его с ES 2.0. То, что вы хотите вместо этого, glGenerateMipmap с glHint и GL_GENERATE_MIPMAP_HINT вариант для него. Пример:

//Create the mipmapped texture
glGenTextures(1, &ColorbufferName);
glBindTexture(ColorbufferName);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_UNSIGNED_BYTE, NULL);
glGenerateMipmap(GL_TEXTURE_2D); // /!\ Allocate the mipmaps /!\

Взято из Эта статья.

Что касается ошибок glm, похоже, что он находит glm правильно, ему просто не нравится, как вы его используете (и только для translate функция). Не могли бы вы опубликовать соответствующие строки из MyApp.cpp (строка с ошибкой и несколько выше и ниже для контекста)?

Другие люди используют glm для работы с emscripten, возможно, этот пост в списке рассылки будет вам полезен: https://groups.google.com/forum/#!topic/emscripten-discuss/b6DY3GCDlug


РЕДАКТИРОВАТЬ: Для ошибок GLM

Вы просто используете неправильные включения.

  • GLM / GTC / matrix_transform.hpp включает только одну версию glm::transform которая принимает матрицу и вершину и возвращает преобразованную матрицу.
  • GLM / GTX / transform2.hpp не содержит никакой версии glm::translate

Что вы хотите GLM / GTX / transform.hpp

1

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

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

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