Added texture data format support

This commit is contained in:
2023-06-20 08:35:28 -07:00
parent 9aa6a0f529
commit 0b26b5a06a
20 changed files with 156 additions and 43 deletions

View File

@ -36,7 +36,12 @@ int32_t Texture::getHeight() {
return this->height;
}
void Texture::setSize(int32_t width, int32_t height, enum TextureFormat format) {
void Texture::setSize(
int32_t width,
int32_t height,
enum TextureFormat format,
enum TextureDataFormat dataFormat
) {
if(this->id != -1) {
glDeleteTextures(1, &this->id);
this->id = -1;
@ -45,6 +50,7 @@ void Texture::setSize(int32_t width, int32_t height, enum TextureFormat format)
this->width = width;
this->height = height;
this->format = format;
this->dataFormat = dataFormat;
glGenTextures(1, &this->id);
if(this->id <= 0) throw "Texture generation failed!";
@ -151,7 +157,6 @@ void Texture::updateTextureProperties() {
void Texture::bufferRaw(void *data) {
assertTrue(this->isReady());
glBindTexture(GL_TEXTURE_2D, this->id);
GLenum format;
switch(this->format) {
@ -175,25 +180,43 @@ void Texture::bufferRaw(void *data) {
assertUnreachable();
}
GLenum dataFormat;
switch(this->dataFormat) {
case TEXTURE_DATA_FORMAT_UNSIGNED_BYTE:
dataFormat = GL_UNSIGNED_BYTE;
break;
case TEXTURE_DATA_FORMAT_FLOAT:
dataFormat = GL_FLOAT;
break;
default:
assertUnreachable();
}
glBindTexture(GL_TEXTURE_2D, this->id);
glTexImage2D(
GL_TEXTURE_2D, 0, format,
this->width, this->height,
0, format, GL_UNSIGNED_BYTE, data
0, format, dataFormat, data
);
glGenerateMipmap(GL_TEXTURE_2D);
this->texturePropertiesNeedUpdating = true;
}
void Texture::buffer(struct ColorU8 pixels[]) {
assertTrue(this->dataFormat == TEXTURE_DATA_FORMAT_UNSIGNED_BYTE);
this->bufferRaw((void*)pixels);
}
void Texture::buffer(struct Color pixels[]) {
assertTrue(this->dataFormat == TEXTURE_DATA_FORMAT_FLOAT);
assertTrue(this->format == TEXTURE_FORMAT_RGBA);
this->bufferRaw((void*)pixels);
// assertUnreachable();
}
void Texture::buffer(uint8_t pixels[]) {
assertTrue(this->dataFormat == TEXTURE_DATA_FORMAT_UNSIGNED_BYTE);
this->bufferRaw((void*)pixels);
}

View File

@ -20,6 +20,7 @@ namespace Dawn {
int32_t height = -1;
GLuint id = -1;
enum TextureFormat format;
enum TextureDataFormat dataFormat;
void updateTextureProperties();
void bufferRaw(void *data);
@ -28,7 +29,12 @@ namespace Dawn {
Texture();
int32_t getWidth() override;
int32_t getHeight() override;
void setSize(int32_t width, int32_t height, enum TextureFormat format) override;
void setSize(
int32_t width,
int32_t height,
enum TextureFormat format,
enum TextureDataFormat dataFormat
) override;
void fill(struct Color) override;
void fill(uint8_t) override;
bool_t isReady() override;

View File

@ -26,7 +26,7 @@ void TextureRenderTarget::setSize(float_t width, float_t height) {
if(this->fboId != -1) glDeleteFramebuffers(1, &this->fboId);
// Resize texture
this->texture.setSize((int32_t)width, (int32_t)height, TEXTURE_FORMAT_RGBA);
this->texture.setSize((int32_t)width, (int32_t)height, TEXTURE_FORMAT_RGBA, TEXTURE_DATA_FORMAT_FLOAT);
this->eventRenderTargetResized.invoke(this, width, height);
// Create Frame Buffer

View File

@ -17,10 +17,10 @@ void SimpleBillboardedShader::compile() {
// Vertex Shader
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec2 aTexCoord;\n"
"layout (location = 1) in vec2 aTexCoord;\n" +
RenderPipelineShaderBuffer::getShaderUniform() + ""
"uniform mat4 u_Proj;\n"
"uniform mat4 u_View;\n"
"uniform mat4 u_Model;\n"
"out vec2 o_TextCoord;\n"
@ -31,7 +31,7 @@ void SimpleBillboardedShader::compile() {
"vec3 right = normalize(cross(up, viewDirection));\n"
"up = normalize(cross(viewDirection, right));\n"
"vec3 billboardPosCam = vec3(u_View * vec4(billboardPos, 1.0));\n"
"gl_Position = u_Proj * vec4(billboardPosCam + (right * aPos.x + up * aPos.y), 1.0);\n"
"gl_Position = u_Projection * vec4(billboardPosCam + (right * aPos.x + up * aPos.y), 1.0);\n"
"o_TextCoord = vec2(aTexCoord.x, aTexCoord.y);\n"
"}",
@ -53,10 +53,10 @@ void SimpleBillboardedShader::compile() {
);
#endif
this->paramProjection = this->getParameterByName("u_Proj");
this->paramView = this->getParameterByName("u_View");
this->paramModel = this->getParameterByName("u_Model");
this->paramColor = this->getParameterByName("u_Color");
this->paramTexture = this->getParameterByName("u_Text");
this->paramHasTexture = this->getParameterByName("u_HasTexture");
this->bufferRenderPipeline = this->getBufferLocationByName(RenderPipelineShaderBuffer::getShaderUniformName());
}

View File

@ -5,12 +5,12 @@
#pragma once
#include "display/shader/Shader.hpp"
#include "display/shader/buffers/RenderPipelineShaderBuffer.hpp"
namespace Dawn {
class SimpleBillboardedShader : public Shader {
public:
shaderparameter_t paramProjection;
shaderparameter_t paramView;
shaderbufferlocation_t bufferRenderPipeline;
shaderparameter_t paramModel;
shaderparameter_t paramColor;
shaderparameter_t paramTexture;

View File

@ -23,7 +23,32 @@ void SimpleBillboardedMaterial::onDispose() {
}
std::vector<struct ShaderPassItem> SimpleBillboardedMaterial::getRenderPasses(IRenderableContext &context) {
return {
auto mesh = this->item->getComponent<MeshRenderer>();
auto shader = this->getGame()->renderManager.getShaderManager()->getShader<SimpleBillboardedShader>(this->shaderLock);
};
assertNotNull(mesh);
assertNotNull(mesh->mesh);
assertNotNull(shader);
struct ShaderPassItem onlyPass;
onlyPass.mesh = mesh->mesh;
onlyPass.shader = shader;
onlyPass.colorValues[shader->paramColor] = this->color;
onlyPass.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
onlyPass.parameterBuffers[shader->bufferRenderPipeline] = &context.renderPipeline->shaderBuffer;
onlyPass.renderFlags = (
RENDER_MANAGER_RENDER_FLAG_BLEND |
RENDER_MANAGER_RENDER_FLAG_DEPTH_TEST
);
if(this->texture != nullptr) {
onlyPass.boolValues[shader->paramHasTexture] = true;
onlyPass.textureSlots[0] = this->texture;
onlyPass.textureValues[shader->paramTexture] = 0;
} else {
onlyPass.boolValues[shader->paramHasTexture] = false;
}
return { onlyPass };
}

View File

@ -5,6 +5,7 @@
#pragma once
#include "scene/components/display/Material.hpp"
#include "scene/components/display/mesh/MeshRenderer.hpp"
namespace Dawn {
class SimpleBillboardedMaterial : public Material {