File indexing completed on 2026-09-01 09:17:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef _Graphic3d_ShaderProgram_HeaderFile
0017 #define _Graphic3d_ShaderProgram_HeaderFile
0018
0019 #include <Graphic3d_RenderTransparentMethod.hxx>
0020 #include <Graphic3d_ShaderAttribute.hxx>
0021 #include <Graphic3d_ShaderObject.hxx>
0022 #include <Graphic3d_ShaderVariable.hxx>
0023 #include <Graphic3d_TextureParams.hxx>
0024 #include <NCollection_Sequence.hxx>
0025
0026
0027 typedef NCollection_Sequence<Handle(Graphic3d_ShaderObject)> Graphic3d_ShaderObjectList;
0028
0029
0030 typedef NCollection_Sequence<Handle(Graphic3d_ShaderVariable)> Graphic3d_ShaderVariableList;
0031
0032
0033 typedef NCollection_Sequence<Handle(Graphic3d_ShaderAttribute)> Graphic3d_ShaderAttributeList;
0034
0035
0036 class Graphic3d_ShaderProgram : public Standard_Transient
0037 {
0038 DEFINE_STANDARD_RTTIEXT(Graphic3d_ShaderProgram, Standard_Transient)
0039 public:
0040
0041 static const Standard_Integer THE_MAX_LIGHTS_DEFAULT = 8;
0042
0043
0044 static const Standard_Integer THE_MAX_CLIP_PLANES_DEFAULT = 8;
0045
0046
0047 static const Standard_Integer THE_NB_FRAG_OUTPUTS = 1;
0048
0049 public:
0050
0051 Standard_EXPORT Graphic3d_ShaderProgram();
0052
0053
0054 Standard_EXPORT virtual ~Graphic3d_ShaderProgram();
0055
0056
0057 Standard_EXPORT virtual Standard_Boolean IsDone() const;
0058
0059
0060 const TCollection_AsciiString& GetId() const { return myID; }
0061
0062
0063
0064
0065
0066 void SetId(const TCollection_AsciiString& theId) { myID = theId; }
0067
0068
0069 const TCollection_AsciiString& Header() const { return myHeader; }
0070
0071
0072
0073
0074
0075
0076
0077
0078 void SetHeader(const TCollection_AsciiString& theHeader) { myHeader = theHeader; }
0079
0080
0081 void AppendToHeader(const TCollection_AsciiString& theHeaderLine)
0082 {
0083 if (!myHeader.IsEmpty())
0084 {
0085 myHeader += "\n";
0086 }
0087 myHeader += theHeaderLine;
0088 }
0089
0090
0091
0092
0093 Standard_Integer NbLightsMax() const { return myNbLightsMax; }
0094
0095
0096 void SetNbLightsMax(Standard_Integer theNbLights) { myNbLightsMax = theNbLights; }
0097
0098
0099 Standard_Integer NbShadowMaps() const { return myNbShadowMaps; }
0100
0101
0102 void SetNbShadowMaps(Standard_Integer theNbMaps) { myNbShadowMaps = theNbMaps; }
0103
0104
0105
0106
0107 Standard_Integer NbClipPlanesMax() const { return myNbClipPlanesMax; }
0108
0109
0110 void SetNbClipPlanesMax(Standard_Integer theNbPlanes) { myNbClipPlanesMax = theNbPlanes; }
0111
0112
0113 Standard_EXPORT Standard_Boolean AttachShader(const Handle(Graphic3d_ShaderObject)& theShader);
0114
0115
0116 Standard_EXPORT Standard_Boolean DetachShader(const Handle(Graphic3d_ShaderObject)& theShader);
0117
0118
0119 const Graphic3d_ShaderObjectList& ShaderObjects() const { return myShaderObjects; }
0120
0121
0122
0123 const Graphic3d_ShaderVariableList& Variables() const { return myVariables; }
0124
0125
0126 const Graphic3d_ShaderAttributeList& VertexAttributes() const { return myAttributes; }
0127
0128
0129
0130 Standard_EXPORT void SetVertexAttributes(const Graphic3d_ShaderAttributeList& theAttributes);
0131
0132
0133
0134 Standard_Integer NbFragmentOutputs() const { return myNbFragOutputs; }
0135
0136
0137
0138 void SetNbFragmentOutputs(const Standard_Integer theNbOutputs) { myNbFragOutputs = theNbOutputs; }
0139
0140
0141 Standard_Boolean HasAlphaTest() const { return myHasAlphaTest; }
0142
0143
0144
0145
0146 void SetAlphaTest(Standard_Boolean theAlphaTest) { myHasAlphaTest = theAlphaTest; }
0147
0148
0149
0150 Standard_Boolean HasDefaultSampler() const { return myHasDefSampler; }
0151
0152
0153 void SetDefaultSampler(Standard_Boolean theHasDefSampler) { myHasDefSampler = theHasDefSampler; }
0154
0155
0156 Graphic3d_RenderTransparentMethod OitOutput() const { return myOitOutput; }
0157
0158
0159
0160
0161 void SetOitOutput(Graphic3d_RenderTransparentMethod theOutput) { myOitOutput = theOutput; }
0162
0163
0164
0165 Standard_Boolean IsPBR() const { return myIsPBR; }
0166
0167
0168
0169 void SetPBR(Standard_Boolean theIsPBR) { myIsPBR = theIsPBR; }
0170
0171
0172 Standard_Integer TextureSetBits() const { return myTextureSetBits; }
0173
0174
0175 void SetTextureSetBits(Standard_Integer theBits) { myTextureSetBits = theBits; }
0176
0177
0178
0179
0180 template <class T>
0181 Standard_Boolean PushVariable(const TCollection_AsciiString& theName, const T& theValue);
0182
0183
0184 Standard_EXPORT void ClearVariables();
0185
0186
0187 Standard_Boolean PushVariableFloat(const TCollection_AsciiString& theName, const float theValue)
0188 {
0189 return PushVariable(theName, theValue);
0190 }
0191
0192
0193 Standard_Boolean PushVariableVec2(const TCollection_AsciiString& theName,
0194 const Graphic3d_Vec2& theValue)
0195 {
0196 return PushVariable(theName, theValue);
0197 }
0198
0199
0200 Standard_Boolean PushVariableVec3(const TCollection_AsciiString& theName,
0201 const Graphic3d_Vec3& theValue)
0202 {
0203 return PushVariable(theName, theValue);
0204 }
0205
0206
0207 Standard_Boolean PushVariableVec4(const TCollection_AsciiString& theName,
0208 const Graphic3d_Vec4& theValue)
0209 {
0210 return PushVariable(theName, theValue);
0211 }
0212
0213
0214 Standard_Boolean PushVariableInt(const TCollection_AsciiString& theName, const int theValue)
0215 {
0216 return PushVariable(theName, theValue);
0217 }
0218
0219
0220 Standard_Boolean PushVariableVec2i(const TCollection_AsciiString& theName,
0221 const Graphic3d_Vec2i& theValue)
0222 {
0223 return PushVariable(theName, theValue);
0224 }
0225
0226
0227 Standard_Boolean PushVariableVec3i(const TCollection_AsciiString& theName,
0228 const Graphic3d_Vec3i& theValue)
0229 {
0230 return PushVariable(theName, theValue);
0231 }
0232
0233
0234 Standard_Boolean PushVariableVec4i(const TCollection_AsciiString& theName,
0235 const Graphic3d_Vec4i& theValue)
0236 {
0237 return PushVariable(theName, theValue);
0238 }
0239
0240 public:
0241
0242
0243
0244 Standard_EXPORT static const TCollection_AsciiString& ShadersFolder();
0245
0246 private:
0247 TCollection_AsciiString myID;
0248 Graphic3d_ShaderObjectList myShaderObjects;
0249 Graphic3d_ShaderVariableList myVariables;
0250 Graphic3d_ShaderAttributeList myAttributes;
0251
0252 TCollection_AsciiString myHeader;
0253 Standard_Integer myNbLightsMax;
0254 Standard_Integer myNbShadowMaps;
0255 Standard_Integer myNbClipPlanesMax;
0256 Standard_Integer myNbFragOutputs;
0257 Standard_Integer myTextureSetBits;
0258 Graphic3d_RenderTransparentMethod myOitOutput;
0259 Standard_Boolean myHasDefSampler;
0260 Standard_Boolean myHasAlphaTest;
0261 Standard_Boolean myIsPBR;
0262
0263 };
0264
0265 DEFINE_STANDARD_HANDLE(Graphic3d_ShaderProgram, Standard_Transient)
0266
0267
0268
0269
0270
0271 template <class T>
0272 inline Standard_Boolean Graphic3d_ShaderProgram::PushVariable(
0273 const TCollection_AsciiString& theName,
0274 const T& theValue)
0275 {
0276 Handle(Graphic3d_ShaderVariable) aVariable = Graphic3d_ShaderVariable::Create(theName, theValue);
0277 if (aVariable.IsNull() || !aVariable->IsDone())
0278 {
0279 return Standard_False;
0280 }
0281
0282 myVariables.Append(aVariable);
0283 return Standard_True;
0284 }
0285
0286 #endif