Я создал программу OpenGL, используя SDL. Я пытался скомпилировать в HTML5 + JS с помощью 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 /!\
Я не слишком знаком с 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::transform
которая принимает матрицу и вершину и возвращает преобразованную матрицу.glm::translate
Что вы хотите GLM / GTX / transform.hpp
Других решений пока нет …