纹理复制
Texture duplicating opengl
我有一个加载纹理的简单函数,但问题是当我加载2个纹理时,第二个纹理与第一个纹理相同。
我认为这可能是一个问题与纹理加载或渲染?
纹理加载:
GLuint loadTexture(std::string path)
{
GLuint load;
glGenTextures(1, &load);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, load);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
float borderColor[] = { 1.0f, 1.0f, 1.0f, 0.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
int tw, th;
unsigned char* image = SOIL_load_image(path.c_str(), &tw, &th, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
return load;
}
渲染和其他:
头
class TexturedCube {
static GLuint vbo;
static GLuint vao;
bool spec;
GLuint texture, specular;
glm::vec3 ambient, diffuse, Lspecular,viewPos;
float shiny;
public:
TexturedCube();
void render(Shader* shader, glm::mat4* model, glm::mat4* view, glm::mat4* projection,glm::vec3 cam);
void setTexture(std::string path);
void setSpecular(std::string path);
void useSpecular(bool x);
void setAttribs(glm::vec3 amb, glm::vec3 diff, glm::vec3 specs, float shine);
};
GLuint loadTexture(std::string);
const GLfloat cubeverts[] = {
// Positions // Normals // Texture Coords
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
};
cpp
void TexturedCube::render(Shader * shader, glm::mat4 * model, glm::mat4 * view, glm::mat4 * projection, glm::vec3 cam)
{
glBindVertexArray(vao);
shader->Use();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glGetUniformLocation(shader->Program, "texture0"), GL_TEXTURE0);
if (spec)
{
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, specular);
glUniform1i(glGetUniformLocation(shader->Program, "texture1"), GL_TEXTURE1);
}
glUniformMatrix4fv(glGetUniformLocation(shader->Program, "model"), 1, GL_FALSE, glm::value_ptr(*model));
glUniformMatrix4fv(glGetUniformLocation(shader->Program, "view"), 1, GL_FALSE, glm::value_ptr(*view));
glUniformMatrix4fv(glGetUniformLocation(shader->Program, "projection"), 1, GL_FALSE, glm::value_ptr(*projection));
glUniform1f(glGetUniformLocation(shader->Program, "material.shininess"), shiny);
glUniform3f(glGetUniformLocation(shader->Program, "material.ambient"), ambient.r, ambient.g, ambient.b);
glUniform3f(glGetUniformLocation(shader->Program, "material.diffuse"), diffuse.r, diffuse.g, diffuse.b);
glUniform3f(glGetUniformLocation(shader->Program, "material.specular"), Lspecular.r, Lspecular.g, Lspecular.b);
glUniform3f(glGetUniformLocation(shader->Program, "viewPos"), cam.x, cam.y, cam.z);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);
}
void TexturedCube::setTexture(std::string path)
{
texture = loadTexture(path);
}
void TexturedCube::setSpecular(std::string path)
{
specular = loadTexture(path);
spec = true;
}
破片材质
#version 330 core
struct Material {
sampler2D texture0;
sampler2D texture1;
float shininess;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
struct PointLight {
vec3 position;
vec3 color;
};
in vec3 FragPos;
in vec3 Normal;
in vec2 TexCoords;
out vec4 color;
uniform vec3 viewPos;
uniform Material material;
uniform PointLight light;
void main()
{
// Ambient
vec3 ambient = material.ambient * vec3(texture(material.texture0, TexCoords));
// Diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = material.diffuse * diff * vec3(texture(material.texture0, TexCoords));
// Specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = material.specular * spec * vec3(texture(material.texture1, TexCoords));
color = vec4(ambient + diffuse + specular, 1.0f);
}
然后在渲染循环中调用SetSpecular()和SetTexture(),然后render()。
谢谢你的帮助
问题是,您将错误的值传递给制服。你要做的是传递纹理单位索引而不是OpenGL常量。所以
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glGetUniformLocation(shader->Program, "texture0"), GL_TEXTURE0);
必须改为
glUniform1i(glGetUniformLocation(shader->Program, "texture0"), 0);
其他纹理相同:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, specular);
glUniform1i(glGetUniformLocation(shader->Program, "texture1"), 1);
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- OpenGL:将纹理复制到主内存
- Cuda-从设备全局内存复制到纹理内存
- 将绑定到FBO的纹理复制到另一个OpenGL上下文
- 如何将 frontBuffer 数据复制到纹理 DirectX 9
- SDL2 渲染复制多个纹理与单个表面
- 使用复制构造函数后不渲染SDL纹理
- 纹理复制
- PBO从同一FBO纹理附件进行双向复制并将其复制到同一FB0纹理附件中
- 如何将纹理从一个设备复制到另一个设备
- 我如何将图像的部分从缓冲区复制到纹理中以渲染