LayerColor support custom shader.

This commit is contained in:
u0u0
2021-03-03 16:28:38 +08:00
parent e9b911cae1
commit 7282606a89
2 changed files with 25 additions and 20 deletions

View File

@@ -58,26 +58,9 @@ LayerColor::LayerColor()
// default blend function
_blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
auto& pipelineDescriptor = _customCommand.getPipelineDescriptor();
auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR);
_programState = new (std::nothrow) backend::ProgramState(program);
pipelineDescriptor.programState = _programState;
auto vertexLayout = _programState->getVertexLayout();
const auto& attributeInfo = _programState->getProgram()->getActiveAttributes();
auto iter = attributeInfo.find("a_position");
if(iter != attributeInfo.end())
{
vertexLayout->setAttribute("a_position", iter->second.location, backend::VertexFormat::FLOAT3, 0, false);
}
iter = attributeInfo.find("a_color");
if(iter != attributeInfo.end())
{
vertexLayout->setAttribute("a_color", iter->second.location, backend::VertexFormat::FLOAT4, sizeof(_vertexData[0].vertices), false);
}
vertexLayout->setLayout(sizeof(_vertexData[0]));
_mvpMatrixLocation = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix");
backend::ProgramState* programState = new (std::nothrow) backend::ProgramState(program);
setProgramState(programState);
_customCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, 6, CustomCommand::BufferUsage::STATIC);
unsigned short indices[] = {0, 1, 2, 2, 1, 3};
@@ -104,6 +87,27 @@ void LayerColor::setBlendFunc(const BlendFunc &var)
_blendFunc = var;
}
void LayerColor::setProgramState(backend::ProgramState* programState)
{
Node::setProgramState(programState);
auto& pipelineDescriptor = _customCommand.getPipelineDescriptor();
pipelineDescriptor.programState = programState;
auto vertexLayout = _programState->getVertexLayout();
const auto& attributeInfo = _programState->getProgram()->getActiveAttributes();
auto iter = attributeInfo.find("a_position");
if(iter != attributeInfo.end()) {
vertexLayout->setAttribute("a_position", iter->second.location, backend::VertexFormat::FLOAT3, 0, false);
}
iter = attributeInfo.find("a_color");
if(iter != attributeInfo.end()) {
vertexLayout->setAttribute("a_color", iter->second.location, backend::VertexFormat::FLOAT4, sizeof(_vertexData[0].vertices), false);
}
vertexLayout->setLayout(sizeof(_vertexData[0]));
_mvpMatrixLocation = _programState->getUniformLocation("u_MVPMatrix");
}
LayerColor* LayerColor::create()
{
LayerColor* ret = new (std::nothrow) LayerColor();

View File

@@ -111,6 +111,8 @@ public:
*@endcode
*/
virtual void setBlendFunc(const BlendFunc& blendFunc) override;
// support custom shader
virtual void setProgramState(backend::ProgramState* programState) override;
CC_CONSTRUCTOR_ACCESS:
LayerColor();
@@ -134,7 +136,6 @@ protected:
backend::UniformLocation _mvpMatrixLocation;
private:
CC_DISALLOW_COPY_AND_ASSIGN(LayerColor);
};
//