texture example
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 110 B |
|
Before Width: | Height: | Size: 121 B After Width: | Height: | Size: 121 B |
|
Before Width: | Height: | Size: 130 B After Width: | Height: | Size: 130 B |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 125 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 133 B After Width: | Height: | Size: 133 B |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 126 B After Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 131 B After Width: | Height: | Size: 131 B |
|
Before Width: | Height: | Size: 125 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 125 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 99 B |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 110 B |
|
Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 96 B |
|
Before Width: | Height: | Size: 90 B After Width: | Height: | Size: 90 B |
|
Before Width: | Height: | Size: 112 B After Width: | Height: | Size: 112 B |
|
Before Width: | Height: | Size: 94 B After Width: | Height: | Size: 94 B |
|
Before Width: | Height: | Size: 92 B After Width: | Height: | Size: 92 B |
|
Before Width: | Height: | Size: 94 B After Width: | Height: | Size: 94 B |
|
Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 101 B |
|
Before Width: | Height: | Size: 100 B After Width: | Height: | Size: 100 B |
|
Before Width: | Height: | Size: 278 B After Width: | Height: | Size: 278 B |
|
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 284 B |
|
Before Width: | Height: | Size: 337 B After Width: | Height: | Size: 337 B |
|
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 456 B |
|
Before Width: | Height: | Size: 421 B After Width: | Height: | Size: 421 B |
|
Before Width: | Height: | Size: 161 B After Width: | Height: | Size: 161 B |
|
Before Width: | Height: | Size: 596 B After Width: | Height: | Size: 596 B |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
12
Assets/resources.conf
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
group=texturedquad-data
|
||||||
|
|
||||||
|
[file]
|
||||||
|
filename=shaders/TexturedQuadShader.frag
|
||||||
|
alias=TexturedQuadShader.frag
|
||||||
|
|
||||||
|
[file]
|
||||||
|
filename=shaders/TexturedQuadShader.vert
|
||||||
|
alias=TexturedQuadShader.vert
|
||||||
|
|
||||||
|
[file]
|
||||||
|
filename=stone.tga
|
||||||
40
Assets/shaders/TexturedQuadShader.frag
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
This file is part of Magnum.
|
||||||
|
|
||||||
|
Original authors — credit is appreciated but not required:
|
||||||
|
|
||||||
|
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
|
||||||
|
2020, 2021, 2022 — Vladimír Vondruš <mosra@centrum.cz>
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
|
||||||
|
this software, either in source code form or as a compiled binary, for any
|
||||||
|
purpose, commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of
|
||||||
|
this software dedicate any and all copyright interest in the software to
|
||||||
|
the public domain. We make this dedication for the benefit of the public
|
||||||
|
at large and to the detriment of our heirs and successors. We intend this
|
||||||
|
dedication to be an overt act of relinquishment in perpetuity of all
|
||||||
|
present and future rights to this software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uniform vec3 color = vec3(1.0, 1.0, 1.0);
|
||||||
|
uniform sampler2D textureData;
|
||||||
|
|
||||||
|
in vec2 interpolatedTextureCoordinates;
|
||||||
|
|
||||||
|
out vec4 fragmentColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
fragmentColor.rgb = color*texture(textureData, interpolatedTextureCoordinates).rgb;
|
||||||
|
fragmentColor.a = 1.0;
|
||||||
|
}
|
||||||
39
Assets/shaders/TexturedQuadShader.vert
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
This file is part of Magnum.
|
||||||
|
|
||||||
|
Original authors — credit is appreciated but not required:
|
||||||
|
|
||||||
|
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
|
||||||
|
2020, 2021, 2022 — Vladimír Vondruš <mosra@centrum.cz>
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
|
||||||
|
this software, either in source code form or as a compiled binary, for any
|
||||||
|
purpose, commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of
|
||||||
|
this software dedicate any and all copyright interest in the software to
|
||||||
|
the public domain. We make this dedication for the benefit of the public
|
||||||
|
at large and to the detriment of our heirs and successors. We intend this
|
||||||
|
dedication to be an overt act of relinquishment in perpetuity of all
|
||||||
|
present and future rights to this software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
layout(location = 0) in vec4 position;
|
||||||
|
layout(location = 1) in vec2 textureCoordinates;
|
||||||
|
|
||||||
|
out vec2 interpolatedTextureCoordinates;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
interpolatedTextureCoordinates = textureCoordinates;
|
||||||
|
|
||||||
|
gl_Position = position;
|
||||||
|
}
|
||||||
BIN
Assets/stone.tga
Normal file
|
After Width: | Height: | Size: 192 KiB |
@@ -10,31 +10,35 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH} ${CM
|
|||||||
|
|
||||||
# Add Corrade as a subproject
|
# Add Corrade as a subproject
|
||||||
add_subdirectory(corrade EXCLUDE_FROM_ALL)
|
add_subdirectory(corrade EXCLUDE_FROM_ALL)
|
||||||
|
set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON)
|
||||||
|
|
||||||
# Add Magnum as a subproject, enable Sdl2Application
|
# Add Magnum as a subproject, enable Sdl2Application
|
||||||
set(MAGNUM_WITH_SDL2APPLICATION ON CACHE BOOL "" FORCE)
|
set(MAGNUM_WITH_SDL2APPLICATION ON CACHE BOOL "" FORCE)
|
||||||
|
set(MAGNUM_WITH_TGAIMPORTER ON CACHE BOOL "" FORCE)
|
||||||
add_subdirectory(magnum EXCLUDE_FROM_ALL)
|
add_subdirectory(magnum EXCLUDE_FROM_ALL)
|
||||||
|
find_package(Magnum REQUIRED GL Sdl2Application Trade TgaImporter)
|
||||||
|
|
||||||
find_package(Magnum REQUIRED GL Sdl2Application)
|
|
||||||
message(STATUS "Magnum found: ${MAGNUM_FOUND}")
|
message(STATUS "Magnum found: ${MAGNUM_FOUND}")
|
||||||
|
|
||||||
set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON)
|
corrade_add_resource(RESOURCES Assets/resources.conf)
|
||||||
|
|
||||||
include_directories(include)
|
|
||||||
|
|
||||||
# Set the sources, allows VS to filter them properly
|
# Set the sources, allows VS to filter them properly
|
||||||
file(GLOB SOURCES "*.cpp")
|
file(GLOB SOURCES "src/*.cpp")
|
||||||
file(GLOB HEADERS "*.h")
|
file(GLOB HEADERS "src/*.h")
|
||||||
|
include_directories(include)
|
||||||
|
|
||||||
add_executable(${PNAME} ${SOURCES} Bird.cpp Bird.h Pipe.cpp Pipe.h)
|
add_executable(${PNAME} ${SOURCES}
|
||||||
|
${RESOURCES})
|
||||||
|
|
||||||
|
add_dependencies(${PNAME} Magnum::TgaImporter)
|
||||||
|
|
||||||
target_link_libraries(${PNAME} PRIVATE
|
target_link_libraries(${PNAME} PRIVATE
|
||||||
|
Corrade::Main
|
||||||
Magnum::Application
|
Magnum::Application
|
||||||
Magnum::GL
|
Magnum::GL
|
||||||
Magnum::Magnum)
|
Magnum::Magnum
|
||||||
|
Magnum::Trade)
|
||||||
# Link CL, GL, and SFML
|
|
||||||
target_link_libraries (${PNAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
|
|
||||||
|
|
||||||
# Setup to use C++11 + others
|
# Setup to use C++11 + others
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
|||||||
@@ -14,19 +14,125 @@
|
|||||||
|
|
||||||
#include <Magnum/GL/DefaultFramebuffer.h>
|
#include <Magnum/GL/DefaultFramebuffer.h>
|
||||||
#include <Magnum/Platform/Sdl2Application.h>
|
#include <Magnum/Platform/Sdl2Application.h>
|
||||||
|
#include <Corrade/Containers/Optional.h>
|
||||||
|
#include <Corrade/Containers/StringView.h>
|
||||||
|
#include <Corrade/PluginManager/Manager.h>
|
||||||
|
#include <Corrade/Utility/Resource.h>
|
||||||
|
#include <Magnum/ImageView.h>
|
||||||
|
#include <Magnum/GL/Buffer.h>
|
||||||
|
#include <Magnum/GL/DefaultFramebuffer.h>
|
||||||
|
#include <Magnum/GL/Mesh.h>
|
||||||
|
#include <Magnum/GL/Texture.h>
|
||||||
|
#include <Magnum/GL/TextureFormat.h>
|
||||||
|
#include <Magnum/Platform/Sdl2Application.h>
|
||||||
|
#include <Magnum/Trade/AbstractImporter.h>
|
||||||
|
#include <Magnum/Trade/ImageData.h>
|
||||||
|
#include <Magnum/GL/AbstractShaderProgram.h>
|
||||||
|
#include <Magnum/GL/Texture.h>
|
||||||
|
#include <Magnum/Math/Color.h>
|
||||||
|
#include <Corrade/Containers/Iterable.h>
|
||||||
|
#include <Corrade/Containers/StringView.h>
|
||||||
|
#include <Corrade/Containers/StringStl.h>
|
||||||
|
#include <Corrade/Utility/Resource.h>
|
||||||
|
#include <Magnum/GL/Context.h>
|
||||||
|
#include <Magnum/GL/Shader.h>
|
||||||
|
#include <Magnum/GL/Version.h>
|
||||||
|
|
||||||
using namespace Magnum;
|
using namespace Magnum;
|
||||||
|
|
||||||
|
class TexturedQuadShader: public GL::AbstractShaderProgram {
|
||||||
|
public:
|
||||||
|
typedef GL::Attribute<0, Vector2> Position;
|
||||||
|
typedef GL::Attribute<1, Vector2> TextureCoordinates;
|
||||||
|
|
||||||
|
explicit TexturedQuadShader();
|
||||||
|
|
||||||
|
TexturedQuadShader& setColor(const Color3& color) {
|
||||||
|
setUniform(_colorUniform, color);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TexturedQuadShader& bindTexture(GL::Texture2D& texture) {
|
||||||
|
texture.bind(TextureUnit);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum: Int { TextureUnit = 0 };
|
||||||
|
|
||||||
|
Int _colorUniform;
|
||||||
|
};
|
||||||
|
|
||||||
|
TexturedQuadShader::TexturedQuadShader() {
|
||||||
|
MAGNUM_ASSERT_GL_VERSION_SUPPORTED(GL::Version::GL330);
|
||||||
|
|
||||||
|
const Utility::Resource rs{"texturedquad-data"};
|
||||||
|
|
||||||
|
GL::Shader vert{GL::Version::GL330, GL::Shader::Type::Vertex};
|
||||||
|
GL::Shader frag{GL::Version::GL330, GL::Shader::Type::Fragment};
|
||||||
|
|
||||||
|
vert.addSource(rs.getString("TexturedQuadShader.vert"));
|
||||||
|
frag.addSource(rs.getString("TexturedQuadShader.frag"));
|
||||||
|
|
||||||
|
CORRADE_INTERNAL_ASSERT_OUTPUT(vert.compile() && frag.compile());
|
||||||
|
|
||||||
|
attachShaders({vert, frag});
|
||||||
|
|
||||||
|
CORRADE_INTERNAL_ASSERT_OUTPUT(link());
|
||||||
|
|
||||||
|
_colorUniform = uniformLocation("color");
|
||||||
|
setUniform(uniformLocation("textureData"), TextureUnit);
|
||||||
|
}
|
||||||
|
|
||||||
class MyApplication: public Platform::Application {
|
class MyApplication: public Platform::Application {
|
||||||
public:
|
public:
|
||||||
explicit MyApplication(const Arguments& arguments);
|
explicit MyApplication(const Arguments& arguments);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void drawEvent() override;
|
void drawEvent() override;
|
||||||
|
|
||||||
|
GL::Mesh _mesh;
|
||||||
|
TexturedQuadShader _shader;
|
||||||
|
GL::Texture2D _texture;
|
||||||
};
|
};
|
||||||
|
|
||||||
MyApplication::MyApplication(const Arguments& arguments): Platform::Application{arguments} {
|
MyApplication::MyApplication(const Arguments& arguments): Platform::Application{arguments} {
|
||||||
/* TODO: Add your initialization code here */
|
struct QuadVertex {
|
||||||
|
Vector2 position;
|
||||||
|
Vector2 textureCoordinates;
|
||||||
|
};
|
||||||
|
const QuadVertex vertices[]{
|
||||||
|
{{ 0.5f, -0.5f}, {1.0f, 0.0f}}, /* Bottom right */
|
||||||
|
{{ 0.5f, 0.5f}, {1.0f, 1.0f}}, /* Top right */
|
||||||
|
{{-0.5f, -0.5f}, {0.0f, 0.0f}}, /* Bottom left */
|
||||||
|
{{-0.5f, 0.5f}, {0.0f, 1.0f}} /* Top left */
|
||||||
|
};
|
||||||
|
const UnsignedInt indices[]{ /* 3--1 1 */
|
||||||
|
0, 1, 2, /* | / /| */
|
||||||
|
2, 1, 3 /* |/ / | */
|
||||||
|
}; /* 2 2--0 */
|
||||||
|
|
||||||
|
_mesh.setCount(Containers::arraySize(indices))
|
||||||
|
.addVertexBuffer(GL::Buffer{vertices}, 0,
|
||||||
|
TexturedQuadShader::Position{},
|
||||||
|
TexturedQuadShader::TextureCoordinates{})
|
||||||
|
.setIndexBuffer(GL::Buffer{indices}, 0,
|
||||||
|
GL::MeshIndexType::UnsignedInt);
|
||||||
|
|
||||||
|
PluginManager::Manager<Trade::AbstractImporter> manager;
|
||||||
|
Containers::Pointer<Trade::AbstractImporter> importer =
|
||||||
|
manager.loadAndInstantiate("TgaImporter");
|
||||||
|
const Utility::Resource rs{"texturedquad-data"};
|
||||||
|
if(!importer || !importer->openData(rs.getRaw("stone.tga")))
|
||||||
|
std::exit(1);
|
||||||
|
|
||||||
|
Containers::Optional<Trade::ImageData2D> image = importer->image2D(0);
|
||||||
|
CORRADE_INTERNAL_ASSERT(image);
|
||||||
|
_texture.setWrapping(GL::SamplerWrapping::ClampToEdge)
|
||||||
|
.setMagnificationFilter(GL::SamplerFilter::Linear)
|
||||||
|
.setMinificationFilter(GL::SamplerFilter::Linear)
|
||||||
|
.setStorage(1, GL::textureFormat(image->format()), image->size())
|
||||||
|
.setSubImage(0, {}, *image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyApplication::drawEvent() {
|
void MyApplication::drawEvent() {
|
||||||
@@ -35,7 +141,12 @@ void MyApplication::drawEvent() {
|
|||||||
GL::Renderer::setClearColor(Color4::red());
|
GL::Renderer::setClearColor(Color4::red());
|
||||||
GL::defaultFramebuffer.clear(GL::FramebufferClear::Color);
|
GL::defaultFramebuffer.clear(GL::FramebufferClear::Color);
|
||||||
|
|
||||||
|
using namespace Math::Literals;
|
||||||
|
|
||||||
|
_shader
|
||||||
|
.setColor(0xffb2b2_rgbf)
|
||||||
|
.bindTexture(_texture)
|
||||||
|
.draw(_mesh);
|
||||||
|
|
||||||
swapBuffers();
|
swapBuffers();
|
||||||
}
|
}
|
||||||