OpenGL尝试渲染2个纹理,但是只有1个吗?

OpenGL疯子

我正在尝试在OpenGL 3中渲染2个纹理。我创建了两个GLfloat类型的顶点数组,生成并绑定了缓冲区等。

注意:纹理加载功能运行良好,我之前已经加载了一个纹理,现在只需要同时渲染两个纹理即可。

然后我像这样加载我的纹理:

GLuint grass = texture.loadTexture("grass.bmp");
GLuint grassLoc = glGetUniformLocation(programID, "grassSampler");
glUniform1i(grassLoc, 0);

GLuint crate = texture.loadTexture("crate.bmp");
GLuint crateLoc = glGetUniformLocation(programID, "crateSampler");
glUniform1i(crateLoc, 1);

这是我绘制它们的方式:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, grass);
glDrawArrays(GL_TRIANGLES, 0, 6); 

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, crate);
glDrawArrays(GL_TRIANGLES, 2, 6);

顶点着色器:

#version 330 core

layout(location = 0) in vec3 grassPosition;
layout(location = 1) in vec2 grassUvPosition;

layout(location = 2) in vec3 cratePosition;
layout(location = 3) in vec2 crateUvPosition;

out vec2 grassUV;
out vec2 crateUV;

uniform mat4 MVP;

void main(){
    gl_Position =  MVP * vec4(grassPosition,1);
    gl_Position =  MVP * vec4(cratePosition,1);
    grassUV = grassUvPosition;
    crateUV = crateUvPosition;
}

片段着色器:

#version 330 core

in vec2 grassUV;
in vec2 crateUV;

out vec3 grassColor;
out vec3 crateColor;

uniform sampler2D grassSampler;
uniform sampler2D crateSampler;

void main(){
    crateColor = texture(grassSampler, grassUV).rgb;
    grassColor = texture(crateSampler, crateUV).rgb;
}

谁能看到我做错了吗?

编辑:我正在尝试在2个不同的VAO上渲染2个不同的纹理

尼科尔·波拉斯(Nicol Bolas)

你有点做的一切错误的; 很难挑出一件事。

您的着色器看起来像是要占据两个位置和两个纹理坐标,大概会生成两个三角形,然后从两个纹理中采样并将颜色写入两个不同的图像。

那不是它的工作原理。除非您使用几何体着色器(并且请勿将其用作认可)glDrawArrays(GL_TRIANGLES, 0, 6);,否则无论您的VS或FS怎么说,您对的调用都将精确渲染2个三角形。

顶点只有一个位置。gl_Position两次写入只会覆盖先前的值,就像在C ++中两次写入任何变量一样。并且要渲染的三角形数量由顶点数量定义。顶点着色器无法创建顶点。它甚至无法销毁它们(尽管通过gl_CullDistance,它可能会剔除整个原始体)。

您不清楚“我只需要同时渲染2个纹理”是什么意思。或更确切地说,“同时”指的是什么。我不知道您的代码应该做什么。

给定您的顶点着色器所需的数据,看起来您有两组单独的三角形,分别具有它们的位置和纹理坐标。您想用一种纹理渲染一组三角形,然后用另一种纹理渲染另一组。

所以... 不必让您的VAO发送2个位置和2个纹理坐标,而仅发送1个。您的VS还应占据一个位置/ texcoord,而FS则应类似地采用单个纹理并写入单个输出。差异取决于您发出渲染调用时当前正在激活的VAO以及绑定到纹理单元0的纹理。

如果您确实打算按照FS的建议写入不同的输出图像,则也应在渲染之间更改FBO。

但是,如果您的目标是使同一个三角形使用带有两个贴图的两个纹理,将单独的结果写入两个图像,您也可以这样做。所不同的是,你只提供一个单一的位置,当你发出你的渲染命令贴图必须同时绑定个纹理单元0和1。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ValueError:new_order [2]为1,但是输入只有1个轴

来自分类Dev

表单上的2个按钮只有1个具有提交类型,但是都触发了Submit事件

来自分类Dev

OPENGL 如何正确渲染这两个具有不同纹理/映射的对象?

来自分类Dev

尝试删除1000个日志条目,但是如果只有999个可用,我会超时

来自分类Dev

一个数据类型可以只有 2 个值吗?或者只有 n 个值?

来自分类Dev

Uncaught TypeError:需要1个参数,但目前只有0个...但是我的函数没有参数?

来自分类Dev

(BackgroundWorker)我正在使用while()尝试输出数字,但是我只有最后一个循环输出的数字

来自分类Dev

我有2个折扣代码,只有一个可以申请吗?

来自分类Dev

我可以/应该创建一个只有 1 个实例的 owl/rdfs 类吗

来自分类Dev

在OpenGL中渲染纹理1到1

来自分类Dev

在OpenGL中以1到1渲染纹理

来自分类Dev

具有多个纹理的OpenGL渲染

来自分类Dev

Python函数有2个列表,但只有1个变化

来自分类Dev

JSON循环只有1个结果

来自分类Dev

只有1个套接字和1个事件-epollin可以epoll_wait()> 1吗?

来自分类Dev

在 2 个 OpenGL 上下文之间共享纹理

来自分类Dev

2个验证器只有1个抛出可捕获的isvalid错误

来自分类Dev

只有1个存在时,FindById返回2个结果

来自分类Dev

如果只有一位,则以1个空格打印吗?

来自分类Dev

OnItemSelected 中的多个 Spinner 只有 1 个 Toast 工作吗?

来自分类Dev

只有 2 个角的按钮

来自分类Dev

Android OpenGL渲染整个网格的纹理的第一个像素

来自分类Dev

OpenGL ES-在屏幕上渲染150,000个纹理的最佳方法

来自分类Dev

索引越界。尝试访问 index: 1 处的元素,但只有 1 个元素匹配定位器 By(xpath, //*[@id="testInstanceScan"] )

来自分类Dev

100个按钮,只有1个活动

来自分类Dev

即使您共享一个应用程序,它也只有一个SHA-1密钥吗?

来自分类Dev

(实例化一个Button数组,但是只有一个起作用

来自分类Dev

我有2个相同的Shell脚本版本。ASCII明智,它们是相同的,但是只有一个可以正确执行

来自分类Dev

SQLite random()行,但是其中1个必须具有特定值吗?

Related 相关文章

  1. 1

    ValueError:new_order [2]为1,但是输入只有1个轴

  2. 2

    表单上的2个按钮只有1个具有提交类型,但是都触发了Submit事件

  3. 3

    OPENGL 如何正确渲染这两个具有不同纹理/映射的对象?

  4. 4

    尝试删除1000个日志条目,但是如果只有999个可用,我会超时

  5. 5

    一个数据类型可以只有 2 个值吗?或者只有 n 个值?

  6. 6

    Uncaught TypeError:需要1个参数,但目前只有0个...但是我的函数没有参数?

  7. 7

    (BackgroundWorker)我正在使用while()尝试输出数字,但是我只有最后一个循环输出的数字

  8. 8

    我有2个折扣代码,只有一个可以申请吗?

  9. 9

    我可以/应该创建一个只有 1 个实例的 owl/rdfs 类吗

  10. 10

    在OpenGL中渲染纹理1到1

  11. 11

    在OpenGL中以1到1渲染纹理

  12. 12

    具有多个纹理的OpenGL渲染

  13. 13

    Python函数有2个列表,但只有1个变化

  14. 14

    JSON循环只有1个结果

  15. 15

    只有1个套接字和1个事件-epollin可以epoll_wait()> 1吗?

  16. 16

    在 2 个 OpenGL 上下文之间共享纹理

  17. 17

    2个验证器只有1个抛出可捕获的isvalid错误

  18. 18

    只有1个存在时,FindById返回2个结果

  19. 19

    如果只有一位,则以1个空格打印吗?

  20. 20

    OnItemSelected 中的多个 Spinner 只有 1 个 Toast 工作吗?

  21. 21

    只有 2 个角的按钮

  22. 22

    Android OpenGL渲染整个网格的纹理的第一个像素

  23. 23

    OpenGL ES-在屏幕上渲染150,000个纹理的最佳方法

  24. 24

    索引越界。尝试访问 index: 1 处的元素,但只有 1 个元素匹配定位器 By(xpath, //*[@id="testInstanceScan"] )

  25. 25

    100个按钮,只有1个活动

  26. 26

    即使您共享一个应用程序,它也只有一个SHA-1密钥吗?

  27. 27

    (实例化一个Button数组,但是只有一个起作用

  28. 28

    我有2个相同的Shell脚本版本。ASCII明智,它们是相同的,但是只有一个可以正确执行

  29. 29

    SQLite random()行,但是其中1个必须具有特定值吗?

热门标签

归档