From 796b4b05ec62eb5d58a634854998f485072e8a2b Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Oct 2021 15:02:46 +0800 Subject: *passing texture to glsl --- Runtime/Graphics/GfxDevice.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'Runtime/Graphics/GfxDevice.cpp') diff --git a/Runtime/Graphics/GfxDevice.cpp b/Runtime/Graphics/GfxDevice.cpp index e4747d8..bd8dd9d 100644 --- a/Runtime/Graphics/GfxDevice.cpp +++ b/Runtime/Graphics/GfxDevice.cpp @@ -1,7 +1,11 @@ +#include #include "GfxDevice.h" static bool deviceInited = false; +static const std::vector s_AvailableTextureUnitPreset = {0,1,2,3,4,5,6,7}; // 最多支持8个贴图 +static std::vector s_AvailableTextureUnit = s_AvailableTextureUnitPreset; + GfxDevice g_GfxDevice; GfxDevice::GfxDevice() @@ -121,6 +125,26 @@ void GfxDevice::SetUniformMat4(const char* name, Internal::Matrix44 mat4) glUniformMatrix4fv(loc, 1, GL_TRUE, &mat4.m[0][0]); } +void GfxDevice::SetUniformTexture(const char* name, Texture* texture) +{ + if (s_AvailableTextureUnit.size() == 0) + { + log_error("No available texture unit. Too many textures or forget invoke ResetUniformsState()"); + return; + } + int texUnit = s_AvailableTextureUnit.back(); + s_AvailableTextureUnit.pop_back(); + glActiveTexture(GL_TEXTURE0 + texUnit); + glBindTexture(GL_TEXTURE_2D, texture->GetGpuID()); + GLint loc = glGetUniformLocation(m_Shader.GetID(), name); + glUniform1i(loc, texUnit); +} + +void GfxDevice::ResetUniformsState() +{ + s_AvailableTextureUnit = s_AvailableTextureUnitPreset; +} + void GfxDevice::BeginFrame() { m_IsInsideFrame = true; -- cgit v1.1-26-g67d0