OpenGL ES 2.0,纹理图像不填充屏幕
我想上传一个简单的纹理来覆盖我在屏幕上绘制的正方形。 没有纹理的代码在屏幕中央显示红色正方形。 我编辑此代码覆盖顶部的纹理,但每次我尝试将纹理应用到正方形时,它都会扭曲图像并在屏幕上移动。 编辑:整个代码可在这里:http://codetidy.com/6291/
应用纹理之前:
应用纹理后:
一些示例代码:
void init()
// Create an OpenGL 2D texture from the BOX resource.
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_SRC_COLOR);
glGenTextures(1, &TextureHandle);
glBindTexture(GL_TEXTURE_2D, TextureHandle);
// Set texture parameters.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
maOpenGLTexImage2D(TEXTURE);
编辑:整个绘制()函数
void draw()
GLfloat vVertices[] = { -1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f
};
GLfloat TexCoord[] = {0.0, 1.0,
0.0, 0.0,
1.0, 1.0,
1.0, 0.0};
// Set the viewport
glViewport(0, 0, mWidth, mHeight);
// Clear the color buffer
glClear(GL_COLOR_BUFFER_BIT);
// Use the program object
glUseProgram(mShader);
checkGLError("glUseProgram");
glBindTexture(GL_TEXTURE_2D, TextureHandle);
// Set uniform function
glUniformMatrix4fv(mMvpLoc, 1, false, MyMatrix);
checkGLError("glUniform4fv");
//glActiveTexture(GL_TEXTURE0);
glUniform1i(mTextureLoc, 0);
// Load the vertex data, i.e attributes and quads
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);
checkGLError("glVertexAttribPointer");
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
checkGLError("glEnableVertexAttribArray");
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
checkGLError("glDrawArrays");
顶点和片段着色器:
char vertexShaderSource[] =
"attribute vec4 vPosition; n"
"uniform mat4 uMvp; n"
"attribute vec2 TexCoordIn; n"
"varying vec2 TexCoordOut; n"
"void main() n"
"{ n"
"gl_Position = uMvp * vPosition; n"
"TexCoordOut = TexCoordIn.xy; n"
"} n";
char fragmentShaderSource[] =
"precision highp float;n"
"varying vec2 TexCoordOut;n"
"uniform sampler2D Texture;n"
"void main()n"
"{n"
"gl_FragColor = texture2D(Texture, TexCoordOut);n"
"}n";
也许你的顶点和纹理属性被交换?
我对这部分有点怀疑:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);
你确定texcoord属性实际上是在位置1吗?
我建议使用glGetAttribLocation来查询这些位置。
虽然你的纹理坐标有些奇怪 - 你给第二个顶点(矩形的左下角)坐标[1,1](纹理的右上角),但除此之外,我在上面的代码中找不到任何错误。
下一个嫌疑犯是MyMatrix
和它的价值。 它似乎有一个unnessary翻译。 也许你有一些代码来居中并失败?
编辑1:矩形的边是2个单位,即它从屏幕中心向所有方向扩展1个单位。 当为投影和模型视图矩阵使用单位矩阵时,这样的矩形将精确地覆盖整个屏幕。 请尝试将您的矩阵设置为身份并验证。 唯一剩下的两名嫌犯是你的正射投影不正确,否则你的视口不能覆盖整个屏幕。 我想不出别的什么
编辑2:在注释中的链接中发布完整源代码后,我尝试在本地运行它(我使用JOGL,但OpenGL部分应该是相同的)。 我发现了一个错误(尽管它在我的系统中有效,但可能会导致你的失败)是:
glBindAttribLocation(programObject, 1, "textureCoordinate");
该变量被声明为varying
。 您的属性名称是inputTextureCoordinate
。 除此之外,代码在我的机器上运行良好(由于不同的环境,我不得不使用不同的代码来加载我的纹理和着色器,并将所有的double
值转换为float
)。 因此,如果上述修复程序无法解决您的问题,请尝试禁用任何功能,即可以在着色器中不增加矩阵,并且不加载/绑定纹理(请改用glColor()
)。 我会注释掉,直到我再次留下简单的红色四边形。 其中一个删除的语句必须是失败的语句。
猛烈地犯这样一个愚蠢的错误! 我试图更新我的代码,并将我的glBindAttributeLocation()命令移动到我的程序链接之前。 这意味着顶点和纹理坐标都不会被加载,因为我认为它们会位于索引的0和1中。这使得我的命令调用它们是无效的。 非常感谢@cs的帮助,没有完全解决问题(因此是新的答案),但让我走上了正确的轨道。
链接地址: http://www.djcxy.com/p/33609.html