簡體   English   中英

將 2 個(或更多)VBO 推送到單個 Opengl 的頂點屬性“位置”

[英]Push 2 (or more) VBOs to a single Opengl's vertex-attribute “location”

是否可以將 2 個(或更多) VBO推送/上行到單個 Opengl 的頂點屬性location

在此處輸入圖像描述

這是我當前的代碼。 如果我每 1 個location最多推送 1 個VBO ,它就可以工作。

glBindBuffer(GL_ARRAY_BUFFER, VBO); 
...
glBindVertexArray(VAO);  // (VAO-scope)
glEnableVertexAttribArray(gl_location);
glVertexAttribPointer(
gl_location, numOfFloat_usually1to4, 
  GL_FLOAT, GL_FALSE, amountOfSpace_inByte_betweenAttribute_usually0,  
  (void*)(stripN.stepOffset* sizeof(float)));  
glVertexAttribDivisor(gl_location,var_0IfPerVertex_1IsPerInstance);

我不想使用 2 個location 每個location都是寶貴的資源。

Opengl的規范是不可能的嗎?

單個頂點着色器輸入位置(又名:頂點屬性)表示最多 4 個標量值的數據。 不能超過 4 個。

從數據的 OpenGL API 端,每個屬性的最多 4 個元素的格式由對該屬性位置的glVertexAttribFormat/Pointer的一次調用定義。 嘗試使用該 VAO 中相同位置的后續調用將覆蓋以前的格式規范。

從接收數據的 GLSL 端來看,從位置到變量的映射並不是那么嚴格。 一些變量類型自然會占用多個位置; layout(location = 0) in mat4 matrix; 將消耗 4 個屬性位置 (0-3)。

同樣,對於元素少於 4 個的基本類型或向量, 多個輸入變量可以通過component布局限定符共享同一位置

layout(location = 0, component = 0) in vec2 first_two;
layout(location = 0, component = 2) in float third;
layout(location = 0, component = 3) in float fourth;

所有 3 個變量都使用相同的屬性位置,但它們使用不同的部分 first_two使用位置的前兩個組件, third來自第三個組件, fourth來自第四個。

從 API 方面來看,它仍然只是使用glVertexAttribFormat(0, 4, ...); 這 4 個組件僅提供 3 個單獨的變量。

當然有限制。 使用相同位置的兩個不同變量的分量不允許重疊。 此外,對於使用相同位置的所有變量,它們的基本類型(浮點、雙精度或整數)必須相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM