2017-06-29 188 views
-1

我正在尝试将纹理映射到二维到三角形。但是目前,我只能得到一个没有任何纹理的渐变色的三角形。这意味着,glsl中的纹理函数总是返回vec4(1,1,1,1),我的textCoords正在工作。我应该如何解决它?任何建议将有助于尝试!OpenGL GLSL纹理函数总是返回vec4(1,1,1,1),白色三角形

顺便说一句,已经在这工作了3天。

构造:

Texture::Texture(const std::string& fileName){ 

    int width, height, numComponents; 
    //float* imageData = stbi_loadf(fileName.c_str(), &width, &height, &numComponents, 4); 
    unsigned char* imageData = stbi_load(fileName.c_str(), &width, &height, &numComponents, 4); 
    if(imageData == NULL){ 
     cerr << "Texture loading failed for "<<fileName<< endl; 
    } 

    glGenTextures(1, &m_texture); 
    glBindTexture(GL_TEXTURE_2D, m_texture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 


    stbi_image_free(imageData); 
} 

纹理结合功能:

void Texture::Bind(){ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, m_texture); 
} 

以我的main.cpp:

m_shader.generateProgramObject(); 
m_shader.attachVertexShader(getAssetFilePath("VertexShader.vs").c_str()); 
m_shader.attachFragmentShader(getAssetFilePath("FragmentShader.fs").c_str() ); 
m_shader.link(); 

// texture created here 
texture = Texture("Assets/bricks.jpg"); 


// enable vertex attribute indices 
glGenVertexArrays(1, &m_vao_triangle); 
glBindVertexArray(m_vao_triangle); 

// Enable the attribute index location for "position" when rendering. 
GLint positionAttribLocation = m_shader.getAttribLocation("position"); 
glEnableVertexAttribArray(positionAttribLocation); 

GLint textCoordLocation = m_shader.getAttribLocation("atextCoord"); 
glEnableVertexAttribArray(textCoordLocation); 


// Restore defaults 
glBindVertexArray(0); 


CHECK_GL_ERRORS; 

uploade三角形数据缓冲

纹理类

vec3 triangleVertices[] = { 
    // Construct equalaterial triangle 
    vec3(0.0f, 0.0f, 0.0f), 
    vec3(0.25f, 1.0f, 0.0), 
    vec3(0.5f, 0.0f, 0.0f) 
}; 

vec2 textCoords[] = { 
     vec2(1.0f, 0.0f), 
     vec2(0.25f, 1.0f), 
     vec2(0.5f, 0.0f)}; 



// Generate a vertex buffer object to hold the triangle's vertex data. 
glGenBuffers(1, &m_vbo_triangle); 

//-- Upload triangle vertex data to the vertex buffer: 
glBindBuffer(GL_ARRAY_BUFFER, m_vbo_triangle); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, 
     GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
CHECK_GL_ERRORS; 




//====generate buffer for holding texture coordinates==== 
glGenBuffers(1, &m_uv_triangle); 
glBindBuffer(GL_ARRAY_BUFFER, m_uv_triangle); 
glBufferData(GL_ARRAY_BUFFER, sizeof(textCoords), textCoords, 
      GL_STATIC_DRAW); 

// Unbind the target GL_ARRAY_BUFFER, now that we are finished using it. 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

CHECK_GL_ERRORS; 

图缓存数据着色器

glBindVertexArray(m_vao_triangle); 

glBindBuffer(GL_ARRAY_BUFFER, m_vbo_triangle); 
GLint positionAttribLocation = m_shader.getAttribLocation("position"); 
glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 



glBindBuffer(GL_ARRAY_BUFFER, m_uv_triangle); 
GLint textCoordLocation = m_shader.getAttribLocation("atextCoord"); 
glVertexAttribPointer(textCoordLocation,2, GL_FLOAT, GL_FALSE, 0, nullptr); 


//-- Unbind target, and restore default values: 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

CHECK_GL_ERRORS; 

上传统一着色器

m_shader.enable(); 

    ... 

    GLint uniformLocation_diffuse = m_shader.getUniformLocation("diffuse"); 
    glUniform1i(uniformLocation_diffuse, 0); 
    CHECK_GL_ERRORS; 

    m_shader.disable(); 

    CHECK_GL_ERRORS; 

在我的绘制函数:

glBindVertexArray(m_vao_triangle); 
// below I tried, but didn't work 
// glClear(GL_STENCIL_BUFFER_BIT); 
// glEnable(GL_BLEND); 
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
// glEnable(GL_DEPTH_TEST); 

texture.Bind(); 
// do these below: 
// glActiveTexture(GL_TEXTURE0); 
// glBindTexture(GL_TEXTURE_2D, texture.m_texture); 

m_shader.enable(); 

glDrawArrays(GL_TRIANGLES, 0, 3); 


m_shader.disable(); 


// Restore defaults 
glBindVertexArray(0); 

CHECK_GL_ERRORS; 

在这里,我也附上我的着色器 verte X着色器:

#version 330 

in vec3 position; 
in vec2 atextCoord; 

uniform mat4 transform; 
out vec2 textCoord; 

void main() { 
    gl_Position = transform * vec4(position, 1.0); 
    textCoord = atextCoord; 
} 

我的片段着色器:

#version 330 

uniform sampler2D diffuse; 

out vec4 fragColor; 
in vec2 textCoord; 

void main() { 

    fragColor = vec4(texture(diffuse, textCoord).rgb,1.0) * vec4(textCoord,0.0,1.0); 
    // texture(...) shows vec4(1,1,1,1) 
    // radiant colour can only prove my textCoord is working 
    // fragColor = texture(diffuse, textCoord); <- only shows a default texture 
} 

here is the running result

Here is the texture image

+0

胶所有的拼凑和编辑的产生[MCVE。 – genpfault

+0

您是否尝试将内部纹理格式从“GL_RGBA32F_ARB”更改为“GL_RGBA8”? – Rabbid76

+0

嗨,刚试过,但没有工作。 @ Rabbid76 – Lalaphoon

回答

0

我找到了一个方法,使其工作。

我复制Texture构造函数中的每一行,并将其粘贴到draw(),而不是调用texture.Bind()。 看起来就像在我准备绘制几何图形之前制作一个纹理,并且这种方式正在工作。

但我仍然必须知道为什么会发生这种情况。对于编码风格,我仍然需要将我的代码放在Texture类中。你介意提供一个解决之前发生的事情吗?

it looks like this right now

+0

等一下。这里发生了一些魔术。我很奇怪。这里的另一个解决方案:我将我的构造函数更改为一个名为setUp(fileName)的函数。现在,我的构造函数是空的。我没有在上面的代码中初始化一个实例,而是调用了texture.setUp(“bricks.jpg”),并且纹理仍然存在,我甚至不需要在我的draw中调用texture.Bind()。 – Lalaphoon