当前位置: 首页 > 知识库问答 >
问题:

使用像素坐标的OpenGL子图像

濮阳振
2023-03-14

我已经完成了learnopengl突破系列中的几个教程。com,所以我有一个非常简单的2D渲染器。不过,我想给它添加一个子图像功能,在这里我可以为一种“源矩形”指定一个vec4,因此如果vec4是(10,10,32,32),它将只渲染一个宽度和高度为32的10,10的矩形,有点像SDL渲染器的工作方式。

渲染器的设置方式是所有精灵都使用一个包含纹理坐标的四边形VAO。起初,我认为我可以为每个精灵使用一个VAO数组,每个都有不同的纹理坐标,但我希望能够在绘制精灵之前更改源矩形,以使动画之类的事情更容易。。。我的第二个想法是将一个单独的统一vec4传递到源矩形的片段着色器中,但如何仅以像素坐标渲染该部分?

共有2个答案

卫俊誉
2023-03-14

我最终在顶点着色器中做到了这一点。我将vec4作为统一传递给顶点着色器,以及图像的大小,并使用以下计算:

// convert pixel coordinates to vertex coordinates
float widthPixel = 1.0f / u_imageSize.x;
float heightPixel = 1.0f / u_imageSize.y;

float startX = u_sourceRect.x, startY = u_sourceRect.y, width = u_sourceRect.z, height = u_sourceRect.w;
v_texCoords = vec2(widthPixel * startX + width * widthPixel * texPos.x, heightPixel * startY + height * heightPixel * texPos.y);

v_texCoords是片段着色器用来映射纹理的变化。

衡泰
2023-03-14

使用Primitiv类型GL_TRIANGLE_STRIPGL_TRIANGLE_FAN来渲染四边形。使用积分一维顶点坐标而不是浮点顶点坐标。顶点坐标是四边形的索引。对于GL_TRIANGLE_FAN,它们是:

vertex 1: 0
vertex 2: 1
vertex 3: 2
vertex 4: 3

使用类型为vec4的统一变量在顶点着色器中设置矩形定义(10,10,32,32)。有了这些信息,可以在顶点着色器中计算顶点坐标:

in int cornerIndex;
uniform vec4 rectangle;

void main()
{
    vec2 vertexArray[4] = 
        vec2[4](rectangle.xy, rectangle.zy, rectangle.zw, rectangle.xw);
    vec2 vertex = vertexArray[cornerIndex];

    // [...]
}

顶点着色器提供内置的输入gl_VertexID,它指定当前正在处理的顶点的索引。在这种情况下,可以使用此变量代替角索引。请注意,顶点着色器不需要有任何显式输入。

 类似资料:
  • 我在将图像转换为极坐标时遇到问题。在Photoshop中很容易:)所以这对我来说是一个新领域。 我有以下图片: 结果应该是这样的: 我在这里看了一下,了解了一些基本知识,但仍然对圆的平方有点困惑: 我几乎不知道如何重新绘制图像。还有一个警告:由于管理限制,我想避免使用像Numpy这样的外部库。

  • 我有一张以色列地图。 我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在地图图像中的那个区域上画一个小圆圈。 我有以下关于地图的信息: null 截图: https://gyazo.com/5a19dece37ebace496c6b8d68eb9ec3c

  • 我正在使用PDFBox的在Java中显示PDF页面。我正试图基于页面中的(即AcroForm字段)在PDF页面的图像上创建可点击的区域。问题是PDF似乎使用了一个完全不同的坐标系: 收益率 如果我要估计图像上字段矩形的实际尺寸,它将是40,40,50,10(x,y,宽度,高度)。这两者之间没有明显的相关性,我似乎找不到任何关于这一点的信息与谷歌。 如何确定PDPage的cosobects的像素位置

  • 有可能吗?如果是,那么它可以怎么做。

  • 我是否也需要一个相机向上向量,这代表什么? 我在用GLM。

  • 我正在尝试将极坐标的图像转换为笛卡尔坐标。 将图像转换为极坐标的示例显式执行-想要一个光滑的矩阵方法 我原以为使用上述方法是小菜一碟,但事实并非如此!!如果有人发现我的代码有错误,请告诉我! 我发现非常奇怪的是,当我改变phi时,它会做出根本性的改变,而不是以我期望的方式! 干杯