Я работаю над проектом OpenGL с двумя экранами: экраном старта и экраном игры. Каждый экран имеет свою собственную текстуру, настройку VAO/VBO и программу шейдеров. После запуска он переключается на игровой экран. Каждый экран активирует свой собственный шейдер, устанавливает униформу Sampler2D в правильный блок текстуры, затем активирует и связывает его текстуру перед рисунком. это пусто. Однако, если я полностью удаляю класс Gamescreen, текстура стартового экрана отображается правильно.Texture texture = Texture("menu_background.png", GL_TEXTURE_2D, GL_TEXTURE0, GL_RGBA, GL_UNSIGNED_BYTE);
< /code>
gamescreen текстура: < /p>
Texture texture = Texture("texture_atlas.png", GL_TEXTURE_2D, GL_TEXTURE1, GL_RGBA, GL_UNSIGNED_BYTE);
< /code>
void draw () of startscreen.h: < /p>
shader.activate();
glUniform1i(glGetUniformLocation(shader.id, "texture2"), 0); // Uses GL_TEXTURE0
texture.activate(GL_TEXTURE0);
texture.bind();
vao.bind();
ebo.bind();
glDrawElements(GL_TRIANGLES, ...);
< /code>
фрагментный шейдер startscreen: < /p>
#version 330 core
uniform sampler2D texture2;
void main() {
FragColor = texture(texture2, tex_coord);
}
< /code>
void draw () of gamescreen.h: < /p>
shader.activate();
glUniform1i(glGetUniformLocation(shader.id, "texture1"), 1); // Uses GL_TEXTURE1
texture.activate(GL_TEXTURE1);
texture.bind();
< /code>
Fragment Shader of Gamescreen.h: < /p>
#version 330 core
uniform sampler2D texture1;
void main() {
FragColor = texture(texture1, tex_coord);
}
< /code>
, а затем в main.cpp: < /p>
window_setting = { window, width, height, true };
StartScreen start_screen = StartScreen();
GameScreen game_screen = GameScreen(&window_setting);
while (!glfwWindowShouldClose(window)) {
process_inputs(window);
if (start_game) {
game_screen.draw();
}
else {
start_screen.draw(); //this is blank. but its music is played, so it means start screen is drawn
}
}
< /code>
Наконец, моя реализация текстуры: < /p>
Texture::Texture(const char* filename, GLenum texture_type, GLenum slot, GLenum format, GLenum pixel_type) {
type = texture_type;
glGenTextures(1, &id);
glActiveTexture(slot);
glBindTexture(texture_type, id);
int width, height, channels;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load(filename, &width, &height, &channels, 0);
if (data) {
glTexImage2D(texture_type, 0, GL_RGBA, width, height, 0, format, pixel_type, data);
glGenerateMipmap(texture_type);
}
else {
cout
Подробнее здесь: https://stackoverflow.com/questions/796 ... is-present
OpenGL: текстура не отображается на экране старта ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1750599460
Anonymous
Я работаю над проектом OpenGL с двумя экранами: экраном старта и экраном игры. Каждый экран имеет свою собственную текстуру, настройку VAO/VBO и программу шейдеров. После запуска он переключается на игровой экран. Каждый экран активирует свой собственный шейдер, устанавливает униформу Sampler2D в правильный блок текстуры, затем активирует и связывает его текстуру перед рисунком. это пусто. Однако, если я полностью удаляю класс Gamescreen, текстура стартового экрана отображается правильно.Texture texture = Texture("menu_background.png", GL_TEXTURE_2D, GL_TEXTURE0, GL_RGBA, GL_UNSIGNED_BYTE);
< /code>
gamescreen текстура: < /p>
Texture texture = Texture("texture_atlas.png", GL_TEXTURE_2D, GL_TEXTURE1, GL_RGBA, GL_UNSIGNED_BYTE);
< /code>
void draw () of startscreen.h: < /p>
shader.activate();
glUniform1i(glGetUniformLocation(shader.id, "texture2"), 0); // Uses GL_TEXTURE0
texture.activate(GL_TEXTURE0);
texture.bind();
vao.bind();
ebo.bind();
glDrawElements(GL_TRIANGLES, ...);
< /code>
фрагментный шейдер startscreen: < /p>
#version 330 core
uniform sampler2D texture2;
void main() {
FragColor = texture(texture2, tex_coord);
}
< /code>
void draw () of gamescreen.h: < /p>
shader.activate();
glUniform1i(glGetUniformLocation(shader.id, "texture1"), 1); // Uses GL_TEXTURE1
texture.activate(GL_TEXTURE1);
texture.bind();
< /code>
Fragment Shader of Gamescreen.h: < /p>
#version 330 core
uniform sampler2D texture1;
void main() {
FragColor = texture(texture1, tex_coord);
}
< /code>
, а затем в main.cpp: < /p>
window_setting = { window, width, height, true };
StartScreen start_screen = StartScreen();
GameScreen game_screen = GameScreen(&window_setting);
while (!glfwWindowShouldClose(window)) {
process_inputs(window);
if (start_game) {
game_screen.draw();
}
else {
start_screen.draw(); //this is blank. but its music is played, so it means start screen is drawn
}
}
< /code>
Наконец, моя реализация текстуры: < /p>
Texture::Texture(const char* filename, GLenum texture_type, GLenum slot, GLenum format, GLenum pixel_type) {
type = texture_type;
glGenTextures(1, &id);
glActiveTexture(slot);
glBindTexture(texture_type, id);
int width, height, channels;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load(filename, &width, &height, &channels, 0);
if (data) {
glTexImage2D(texture_type, 0, GL_RGBA, width, height, 0, format, pixel_type, data);
glGenerateMipmap(texture_type);
}
else {
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79675167/opengl-texture-not-displaying-on-start-screen-when-game-screen-is-present[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия