Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于现代OpenGL的像素级纹理映射_Opengl_Glsl_Texture Mapping_Shader - Fatal编程技术网

基于现代OpenGL的像素级纹理映射

基于现代OpenGL的像素级纹理映射,opengl,glsl,texture-mapping,shader,Opengl,Glsl,Texture Mapping,Shader,在决定尝试使用现代OpenGL编程后,我已经放弃了固定的函数管道,我不能完全确定是否能获得与以前相同的功能 我正在尝试使用像素完美大小的纹理贴图四边形,匹配纹理大小。例如,128x128纹理映射到大小为128x128的四边形 这是我的顶点着色器 #version 110 uniform float xpos; uniform float ypos; uniform float tw; // texture width in pixels uniform

在决定尝试使用现代OpenGL编程后,我已经放弃了固定的函数管道,我不能完全确定是否能获得与以前相同的功能

我正在尝试使用像素完美大小的纹理贴图四边形,匹配纹理大小。例如,128x128纹理映射到大小为128x128的四边形

这是我的顶点着色器


    #version 110
    uniform float xpos;
    uniform float ypos;
    uniform float tw; // texture width in pixels
    uniform float th; // texture height in pixels
    attribute vec4 position;
    varying vec2 texcoord;        
void main()
    {
    mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
                                  0.0, 2.0/800.0, 0.0, -1.0,
                                  0.0, 0.0, -1.0, 0.0,
                                  0.0, 0.0, 0.0, 1.0); 

    gl_Position = position * projectionMatrix;
    texcoord = (gl_Position.xy);
    }
这是我的片段着色器:


    #version 110
    uniform float fade_factor;    
    uniform sampler2D textures[1];
    varying vec2 texcoord;

    void main()
    {
        gl_FragColor = texture2D(textures[0], texcoord);
    }
我的顶点数据就是这样,其中w和h是纹理的宽度和高度


    [
     0, 0,
     w, 0,
     w, h,
     0, h
    ]
我加载了128x128纹理,使用这些着色器,我看到图像重复了4次:


鉴于tw th、xpos、xpos制服,有人能就正确的翻译和缩放方式提供建议吗?

这有一个问题:

mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
                                  0.0, 2.0/800.0, 0.0, -1.0,
                                  0.0, 0.0, -1.0, 0.0,
                                  0.0, 0.0, 0.0, 1.0); 

gl_Position = position * projectionMatrix;
变换矩阵是右关联的,也就是说,应该按相反的顺序相乘。此外,通常不在着色器中指定投影矩阵,而是将其作为均匀对象传递。OpenGL为投影和modelview提供了现成的制服。在OpenGL-3内核中,您可以重用统一名称以保持兼容

// predefined by OpenGL version < 3 core:
#if __VERSION__ < 400
uniform mat4 gl_ProjectionMatrix;
uniform mat4 gl_ModelviewMatrx;
uniform mat4 gl_ModelviewProjectionMatrix; // premultiplied gl_ProjectionMatrix * gl_ModelviewMatrix
uniform mat4 gl_ModelviewInverseTranspose; // needed for transformin normals

attribute vec4 gl_Vertex;

varying vec4 gl_TexCoord[];
#endif 

void main()
{
     gl_Position = gl_ModelviewProjectionMatrix * gl_Vertex;
}
//由OpenGL版本<3核心预定义:
#如果版本小于400
均匀mat4-gl_投影矩阵;
统一mat4 gl_模型视图MATRx;
统一mat4 gl_ModelviewProjectionMatrix;//预乘gl_投影矩阵*gl_模型视图矩阵
统一mat4 gl_ModelViewInverseTransfose;//需要在法线中进行转换
属性向量4 gl_顶点;
可变vec4 gl_TexCoord[];
#恩迪夫
void main()
{
gl_位置=gl_模型视图投影矩阵*gl_顶点;
}

接下来,您必须了解纹理坐标不处理纹理像素(texel),但纹理应理解为具有给定采样点的插值函数;纹理坐标0或1不会击中纹理的中心,但正好位于环绕之间,因此模糊。只要屏幕上的四边形大小与纹理尺寸完全匹配,就可以了。但是,只要你只想显示一个子图像,事情就会变得有趣起来(我把它作为一个练习留给读者,让他们找出精确的映射;提示:解决方案中会有术语0.5/dimension和(dimension-1)/dimension)

你好,Lefty!欢迎来到StackOverflow。一些需要记住的事情-请用四个空格(或用
{}
图标)缩进代码,以便正确格式化。此外,在
OpenGL
标记中发布时,指定您的OpenGL版本会很有帮助。特别是因为您的代码示例听起来像OpenGL 2.0,它确实很有用,但在今天并不真正“现代”。)谢谢你的回复。这是现代的OpenGL(>=3?),因为我没有使用固定的函数管道,我的顶点数据是以数组形式提供的,纹理采样是用着色器完成的。也就是说,我对这个问题还是比较陌生的,所以如果我错了,请纠正我:)相关的,这个问题对你来说很容易,DW!:O