Opengl纹理奇怪的渲染。黑色和白色,RGB分离,平铺

时间:2018-02-08 09:06:15

标签: c# opengl textures

所以我试图使用OpenGL将纹理渲染到四边形并且我得到一个非常奇怪的神器,我认为它是由我的加载方法引起的,但我不是真的确定。

当您接近四边形时,您可以看到它正在渲染红色的绿色和蓝色彼此相邻。有点看起来就像电视上的像素一样

Rendered Quad

Close up of quad

Texture

LoadTexture

public static uint LoadTexture(string filePath)
{
    Bitmap bitmap = new Bitmap("Res/" + filePath);

    Gl.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
    uint textureID = Gl.GenTexture();
    Gl.BindTexture(TextureTarget.Texture2d, textureID);

    BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
        ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    Gl.TexImage2D(TextureTarget.Texture2d, 0, InternalFormat.Rgb8, data.Width, data.Height, 0, OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
    bitmap.UnlockBits(data);

    Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
    Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

    return textureID;
}

渲染

public void Render(TexturedModel texturedModel, StaticShader shader)
{
    RawModel model = texturedModel.model;
    using (MemoryLock vertexPositions = new MemoryLock(model.vertexPositions))
    using (MemoryLock texturePositions = new MemoryLock(texturedModel.textureCords))
    {
        Gl.VertexAttribPointer((uint)shader.locationPosition, model.dimension, VertexAttribType.Float, false, 0, vertexPositions.Address);
        Gl.EnableVertexAttribArray((uint)shader.locationPosition);

        Gl.VertexAttribPointer((uint)shader.locationTexturedCoords, 2, VertexAttribType.Float, false, 0, texturePositions.Address);
        Gl.EnableVertexAttribArray((uint)shader.locationTexturedCoords);

        Gl.PixelStore(PixelStoreParameter.UnpackAlignment, 0);
        Gl.ActiveTexture(TextureUnit.Texture0);
        Gl.BindTexture(TextureTarget.Texture2d, texturedModel.texture.TextureID);
        Gl.Uniform1(shader.locationTextureSampler, 0);

        Gl.UniformMatrix4(shader.locationProjectionMatrix, false, projectionMatrix.ToArray());
        viewMatrix = Maths.CreateViewMatrix(camera);
        Gl.UniformMatrix4(shader.locationViewMatrix, false, viewMatrix.ToArray());
        Gl.UniformMatrix4(shader.locationTransformationMatrix, false, model.modelMatrix.ToArray());

        //Gl.DrawArrays(PrimitiveType.Triangles, 0, model.vertexPositions.Length / model.dimension);
        Gl.DrawElements(PrimitiveType.Triangles, model.indices.Length, DrawElementsType.UnsignedInt, model.indices);
    }
}

着色器程序

public class StaticShader : ShaderProgram
{
    private static string VERTEX_FILE = @"Shader/VertexShader.txt";
    private static string FRAGMENTSHADER = @"Shader/FragmentShader.txt";

    public int locationPosition;
    public int locationTexturedCoords;
    public int locationTransformationMatrix;
    public int locationProjectionMatrix;
    public int locationViewMatrix;
    public int locationTextureSampler;

    public StaticShader() : base(VERTEX_FILE, FRAGMENTSHADER)
    {
        locationTransformationMatrix = this.GetUniformLocation("transformationMatrix");
        locationProjectionMatrix = this.GetUniformLocation("projectionMatrix");
        locationViewMatrix = this.GetUniformLocation("viewMatrix");
        locationTexturedCoords = this.GetAttribLocation("textureCords");
        locationPosition = this.GetAttribLocation("position");
        locationTextureSampler = this.GetUniformLocation("textureSampler");
    }
}

片段着色器

varying vec2 outTextureCords;

uniform sampler2D textureSampler;

void main() {
    gl_FragColor = texture(textureSampler, outTextureCords);
}

顶点

public float[] vertexPositions = new float[] {
            -0.5f,0.5f,0,   //V0
            -0.5f,-0.5f,0,  //V1
            0.5f,-0.5f,0,   //V2
            0.5f,0.5f,0     //V3
    };

public int[] indices = new int[] {
            0,1,3,  //Top left triangle (V0,V1,V3)
            3,1,2   //Bottom right triangle (V3,V1,V2)
    };

public float[] textureCords = {

            0,0,
            0,1,
            1,1,
            1,0
    };

1 个答案:

答案 0 :(得分:1)

将TexImage2d中的opengl格式更改为B并将internalFormat切换为rgba

Gl.TexImage2D(TextureTarget.Texture2d, 0, InternalFormat.Rgba, data.Width, data.Height, 0, OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
相关问题