Browse Source

多重纹理

master
blobt 4 years ago
parent
commit
3f3bf076c0
  1. BIN
      .vs/shader/v14/.suo
  2. 3
      Res/test.fs
  3. BIN
      Res/test2.bmp
  4. 9
      scene.cpp
  5. 23
      shader.cpp
  6. 10
      shader.h

BIN
.vs/shader/v14/.suo

3
Res/test.fs

@ -2,9 +2,10 @@
precision mediump float;
#endif
uniform sampler2D U_Texture;
uniform sampler2D U_Texture2;
varying vec4 V_Color;
varying vec2 V_Texcoord;
void main()
{
gl_FragColor=V_Color*texture2D(U_Texture,V_Texcoord);
gl_FragColor=V_Color*texture2D(U_Texture,V_Texcoord)*texture2D(U_Texture2,V_Texcoord);
}

BIN
Res/test2.bmp

9
scene.cpp

@ -3,7 +3,6 @@
#include "utils.h"
#include "ground.h"
GLuint texture;
glm::mat4 modelMatrix, viewMatrix, projectionMatrix;
Ground ground;
GLint textureLocation;
@ -30,13 +29,11 @@ void Init() {
/* ³õʼ»¯ shader */
shader = new Shader;
shader->Init("Res/test.vs", "Res/test.fs");
textureLocation = glGetUniformLocation(shader->mProgram, "U_Texture");
shader->SetTexture("U_Texture", "Res/test.bmp");
shader->SetTexture("U_Texture2", "Res/test2.bmp");
modelMatrix = glm::translate(0.0f, 0.0f, -0.6f);
texture = CreateTexture2DFromBMP("Res/test.bmp");
ground.Init();
}
void SetViewPortSize(float width, float height) {
@ -51,8 +48,6 @@ void Draw() {
vertexbuffer->Bind();
shader->Bind(glm::value_ptr(modelMatrix), glm::value_ptr(viewMatrix), glm::value_ptr(projectionMatrix));
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(textureLocation, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
vertexbuffer->Unbind();
}

23
shader.cpp

@ -36,6 +36,13 @@ void Shader::Bind(float *M, float *V, float*P) {
glUniformMatrix4fv(mViewMatrixLocation, 1, GL_FALSE, V);
glUniformMatrix4fv(mProjectionMatrixLocation, 1, GL_FALSE, P);
int iIndex = 0;
for (auto iter = mUniformTextures.begin(); iter != mUniformTextures.end(); ++iter) {
glActiveTexture(GL_TEXTURE0 + iIndex);
glBindTexture(GL_TEXTURE_2D, iter->second->mTexture);
glUniform1i(iter->second->mLocation, iIndex++);
}
glEnableVertexAttribArray(mPositionLocation);
glVertexAttribPointer(mPositionLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
@ -47,4 +54,20 @@ void Shader::Bind(float *M, float *V, float*P) {
glEnableVertexAttribArray(mNormalLocation);
glVertexAttribPointer(mNormalLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 12));
}
void Shader::SetTexture(const char * name, const char*imagePath) {
auto iter = mUniformTextures.find(name);
if (iter == mUniformTextures.end()) {
GLint location = glGetUniformLocation(mProgram, name);
if (location != -1) {
UniformTexture* t = new UniformTexture;
t->mLocation = location;
t->mTexture = CreateTexture2DFromBMP(imagePath);
mUniformTextures.insert(std::pair<std::string, UniformTexture*>(name, t));
}
}
else {
glDeleteTextures(1, &iter->second->mTexture);
iter->second->mTexture = CreateTexture2DFromBMP(imagePath);
}
}

10
shader.h

@ -1,10 +1,20 @@
#pragma once
#include "ggl.h"
struct UniformTexture {
GLint mLocation;
GLuint mTexture;
UniformTexture() {
mLocation = -1;
mTexture = 0;
}
};
class Shader {
public:
GLuint mProgram;
std::map<std::string, UniformTexture*> mUniformTextures;
GLint mModelMatrixLocation, mViewMatrixLocation, mProjectionMatrixLocation;
GLint mPositionLocation, mColorLocation, mTexcoordLocation, mNormalLocation;
void Init(const char*vs, const char*fs);
void Bind(float *M, float *V, float*P);
void SetTexture(const char * name, const char*imagePath);
};
Loading…
Cancel
Save