在FragementShader的begin函数中准备输入的顶点数据偏移

This commit is contained in:
2025-12-04 23:09:04 +08:00
parent 0cd230b577
commit 656ce63d55
18 changed files with 162 additions and 117 deletions
+3 -3
View File
@@ -22,9 +22,9 @@ public:
bool addElement(const std::string& name, VertexElementType elementType,
ComponentType componentType, DataType dataType);
const Element* getElement(size_t index) const;
const Element* getElement(VertexElementType elementType) const;
const Element* getElement(const std::string& name) const;
const Element* getElementByIndex(size_t index) const;
const Element* getElementByType(VertexElementType elementType) const;
const Element* getElementByName(const std::string& name) const;
//total byte size of each vertex
size_t vertexByteSize(void) const { return m_vertexSize; }
@@ -28,9 +28,9 @@ class FragementShaderInterface
public:
virtual const char* getName(void) const = 0;
virtual void begin(const RenderPipe* pipe, MaterialConstPtr material) = 0;
virtual bool begin(const RenderPipe* pipe, MaterialConstPtr material, const VertexDesc& veretexDesc) = 0;
virtual void process(const VertexDesc& veretexDesc, const float32_t* pixelData, fVector4& color) = 0;
virtual void process(const float32_t* pixelData, fVector4& color) = 0;
virtual void end() = 0;
};
@@ -75,7 +75,7 @@ bool VertexDesc::addElement(const std::string& name, VertexElementType elementTy
return true;
}
const VertexDesc::Element* VertexDesc::getElement(size_t index) const
const VertexDesc::Element* VertexDesc::getElementByIndex(size_t index) const
{
if (index >= m_elements.size())
{
@@ -84,24 +84,24 @@ const VertexDesc::Element* VertexDesc::getElement(size_t index) const
return &(m_elements[index]);
}
const VertexDesc::Element* VertexDesc::getElement(VertexElementType type) const
const VertexDesc::Element* VertexDesc::getElementByType(VertexElementType type) const
{
auto it = m_elementTypeMap.find(type);
if (it == m_elementTypeMap.end())
{
return nullptr;
}
return getElement(it->second);
return getElementByIndex(it->second);
}
const VertexDesc::Element* VertexDesc::getElement(const std::string& name) const
const VertexDesc::Element* VertexDesc::getElementByName(const std::string& name) const
{
auto it = m_nameMap.find(name);
if (it == m_nameMap.end())
{
return nullptr;
}
return getElement(it->second);
return getElementByIndex(it->second);
}
DV_CORE_END_NAMESPACE
@@ -64,7 +64,7 @@ void VertexShaderStep::process(RenderPipe& pipe, const InputAssemberStep::NodeAr
//TODO: div-zero
size_t ndcPosOffset = outputNode.vertexDesc.getElement(VET_POSITION_NDC)->offset;
size_t ndcPosOffset = outputNode.vertexDesc.getElementByType(VET_POSITION_NDC)->offset;
const fVector3* vertexNDCPos = (const fVector3*)(outputVertexMemory+ndcPosOffset);
outputNode.depth[i] = (std::fabsf(vertexNDCPos->z) - cameraNear) / (cameraFar - cameraNear);
@@ -31,10 +31,14 @@ void RasterizerStep::process(RenderPipe& pipe, const VertexShaderStep::NodeArray
debugMaterial->pickupParam(node.material);
}
FragementShaderInterface* fragementShader = debugMaterial ? debugMaterial->getFragementShader() : node.material->getFragementShader();
fragementShader->begin(&pipe, debugMaterial ?debugMaterial : node.material);
if (!(fragementShader->begin(&pipe, debugMaterial ? debugMaterial : node.material, node.vertexDesc)))
{
//TODO: shader fallback
continue;
}
size_t vertexSize = node.vertexDesc.vertexByteSize();
size_t POS_offset = node.vertexDesc.getElement(VET_POSITION_NDC)->offset;
size_t POS_offset = node.vertexDesc.getElementByType(VET_POSITION_NDC)->offset;
for (size_t i = 0; i < node.vertexCounts; i += 3)
{
@@ -69,13 +73,8 @@ void RasterizerStep::process(RenderPipe& pipe, const VertexShaderStep::NodeArray
pixelData[j] = MathUtil::lerp3(vertex0[j], vertex1[j], vertex2[j], percentCorrected);
}
//if(dot.first==570 && dot.second==405 )
//{
// int a = 0;
//}
fVector4 color;
fragementShader->process(node.vertexDesc, &(pixelData[0]), color);
fragementShader->process(pixelData.data(), color);
float32_t depth = MathUtil::lerp3(vertexDepth[0], vertexDepth[1], vertexDepth[2], percentCorrected);