Opengl es 纹理都是黑色的

Opengl es 纹理都是黑色的,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,据我所知,我第一次尝试在三角形上绘制纹理的设置是正确的,但它显示为全黑色 我正在将图像发送到OpenGL,如下所示: GLuint gridTexture; glGenTextures(1, &gridTexture); glBindTexture(GL_TEXTURE_2D, gridTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexPa

据我所知,我第一次尝试在三角形上绘制纹理的设置是正确的,但它显示为全黑色

我正在将图像发送到OpenGL,如下所示:

   GLuint gridTexture;
    glGenTextures(1, &gridTexture);
    glBindTexture(GL_TEXTURE_2D, gridTexture);
    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_RGBA, size.x,
                 size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
虽然我不确定如何测试“像素”是否符合我的预期,但我确实知道
size.x
size.y
变量正确记录了我使用的PNG,因此我假设像素也工作正常,因为它们都是在我的资源加载器中一起提取的

我的着色器很简单:

attribute vec4 Position;
attribute vec4 SourceColor;
attribute vec2 TextureCoordinate;

varying vec4 DestinationColor;
varying vec2 TextureCoordOut;

uniform mat4 Projection;
uniform mat4 Modelview;

void main(void)
{
    DestinationColor = SourceColor;

    gl_Position=Projection*Modelview*Position;
    TextureCoordOut = TextureCoordinate;
}
片段:

varying lowp vec4 DestinationColor;
varying mediump vec2 TextureCoordOut;

uniform sampler2D Sampler;

void main(void)
{
    gl_FragColor = texture2D(Sampler, TextureCoordOut) * DestinationColor;
//        gl_FragColor = DestinationColor; //this works and I see varied colors fine
}
我从客户端内存发送纹理坐标,如下所示:

glEnableVertexAttribArray(textCoordAttribute));    
glVertexAttribPointer(textCoordAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(vec2),&texs[0]);
三角形及其带有纹理坐标的顶点如下所示;我知道坐标没有经过打磨,我只想在屏幕上看到一些东西:

//omitting structures that I use to hold my vertex data, but you can at least see the vertices and the coordinates I am associating with them. The triangle draws fine, and if I disable the texture2D() function in the frag shader I can see the colors of the vertices so everything appears to be working except the texture itself.

    top.Color=vec4(1,0,0,1);
    top.Position=vec3(0,300,0);
    texs.push_back(vec2(0,1));

    right.Color=vec4(0,1,0,1);
    right.Position=vec3(300,0,0);
    texs.push_back(vec2(1,0));

    left.Color=vec4(0,0,1,1);
    left.Position=vec3(-300,0,0);
    texs.push_back(vec2(0,0));

    verts.push_back(top);
    verts.push_back(right);
    verts.push_back(left);
为了更好的测量,我尝试在绘图之前再次使用glBindTexture绑定纹理,以使其处于“活动”状态,但这没有任何区别


我想可能有一个非常简单的步骤我没有在某处执行,但我在任何地方都找不到它。

通过将我的纹理尺寸设置为长度和宽度的2次方解决了这个问题

设置过滤器之前,必须将数据绑定到纹理。您必须先调用glTexImage2D

GLuint gridTexture;
glGenTextures(1, &gridTexture);
glBindTexture(GL_TEXTURE_2D, gridTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x,
                 size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

对于那些纹理显示为黑色的人,我发现的另一个原因是,如果在创建纹理时(在glTexImage2D之前)不设置这些简单的参数,纹理将显示为黑色

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

为什么OpenGL标签会从中删除?这里没有ES特定的代码或技术;它们也适用于桌面OpenGL。是的,正如datenwolf对您答案的评论所示。可以在上传纹理数据之前设置glTexParameter。有些驱动程序在这方面有缺陷,但是一个符合标准的OpenGL实现不能对图像和参数的设置顺序进行限制。哦,对不起,我刚刚想起了一些事情。我以前遇到过类似的问题,第一次看到你的代码时,我注意到了顺序(与我的不同),我做了很多事情,我认为顺序很重要也是黑色的?请检查您的OpenGL版本!OpenGL-2解除了2的威力限制,因此很可能您运行的是OpenGL-1.x–这表明您的驱动程序安装不正确。请参阅您对GL_版本和GL_渲染器感兴趣的参考资料。嗯,您使用的是着色器,因此您正在现代OpenGL版本上运行,仔细想想。但我不认为这是一个对齐问题,因为如果对齐不正确,你会看到一些东西(扭曲的图像)…宾果!datenwolf的评论清楚地说明了为什么
opengl
标签完全放错了位置。因为datenwolf说如果在桌面GL中使用着色器,版本需要足够高以支持NPOT纹理。但在OpenGLES2.0中,情况并非如此。