lwjglshaderobjectsstate.java
来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 394 行 · 第 1/2 页
JAVA
394 行
if (programID == -1)
programID = ARBShaderObjects.glCreateProgramObjectARB();
if (vertexByteBuffer != null) {
if (vertexShaderID != -1)
removeVertShader();
vertexShaderID = ARBShaderObjects.glCreateShaderObjectARB(
ARBVertexShader.GL_VERTEX_SHADER_ARB);
// Create the sources
ARBShaderObjects
.glShaderSourceARB(vertexShaderID, vertexByteBuffer);
// Compile the vertex shader
IntBuffer compiled = BufferUtils.createIntBuffer(1);
ARBShaderObjects.glCompileShaderARB(vertexShaderID);
ARBShaderObjects.glGetObjectParameterARB(vertexShaderID,
ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB, compiled);
checkProgramError(compiled, vertexShaderID);
// Attach the program
ARBShaderObjects.glAttachObjectARB(programID, vertexShaderID);
} else if (vertexShaderID != -1) {
removeVertShader();
vertexShaderID = -1;
}
if (fragmentByteBuffer != null) {
if (fragmentShaderID != -1)
removeFragShader();
fragmentShaderID = ARBShaderObjects.glCreateShaderObjectARB(
ARBFragmentShader.GL_FRAGMENT_SHADER_ARB);
// Create the sources
ARBShaderObjects
.glShaderSourceARB(fragmentShaderID, fragmentByteBuffer);
// Compile the fragment shader
IntBuffer compiled = BufferUtils.createIntBuffer(1);
ARBShaderObjects.glCompileShaderARB(fragmentShaderID);
ARBShaderObjects.glGetObjectParameterARB(fragmentShaderID,
ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB, compiled);
checkProgramError(compiled, fragmentShaderID);
// Attatch the program
ARBShaderObjects.glAttachObjectARB(programID, fragmentShaderID);
} else if (fragmentShaderID != -1) {
removeFragShader();
fragmentShaderID = -1;
}
ARBShaderObjects.glLinkProgramARB(programID);
setNeedsRefresh(true);
needSendShader = false;
}
/** Removes the fragment shader */
private void removeFragShader() {
if (fragmentShaderID != -1) {
ARBShaderObjects.glDetachObjectARB(programID, fragmentShaderID);
ARBShaderObjects.glDeleteObjectARB(fragmentShaderID);
}
}
/** Removes the vertex shader */
private void removeVertShader() {
if (vertexShaderID != -1) {
ARBShaderObjects.glDetachObjectARB(programID, vertexShaderID);
ARBShaderObjects.glDeleteObjectARB(vertexShaderID);
}
}
/**
* Check for program errors. If an error is detected, program exits.
*
* @param compiled the compiler state for a given shader
* @param id shader's id
*/
private void checkProgramError(IntBuffer compiled, int id) {
if (compiled.get(0) == 0) {
IntBuffer iVal = BufferUtils.createIntBuffer(1);
ARBShaderObjects.glGetObjectParameterARB(id,
ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB, iVal);
int length = iVal.get();
String out = null;
if (length > 0) {
ByteBuffer infoLog = BufferUtils.createByteBuffer(length);
iVal.flip();
ARBShaderObjects.glGetInfoLogARB(id, iVal, infoLog);
byte[] infoBytes = new byte[length];
infoLog.get(infoBytes);
out = new String(infoBytes);
}
logger.severe(out);
throw new JmeException("Error compiling GLSL shader: " + out);
}
}
/**
* Applies those shader objects to the current scene. Checks if the
* GL_ARB_shader_objects extension is supported before attempting to enable
* those objects.
*
* @see com.jme.scene.state.RenderState#apply()
*/
public void apply() {
if (isSupported()) {
//Ask for the current state record
RenderContext<?> context = DisplaySystem.getDisplaySystem().getCurrentContext();
ShaderObjectsStateRecord record = (ShaderObjectsStateRecord) context.getStateRecord(StateType.GLSLShaderObjects);
context.currentStates[StateType.GLSLShaderObjects.ordinal()] = this;
if (needSendShader){
sendToGL(vertShader, fragShader);
}
if (shaderDataLogic != null) {
shaderDataLogic.applyData(this, geom);
}
if (!record.isValid() || record.getReference() != this ||
needsRefresh()) {
record.setReference(this);
if (isEnabled()) {
if (programID != -1) {
ARBShaderObjects.glUseProgramObjectARB(programID);
for (int i = shaderAttributes.size(); --i >= 0;) {
ShaderVariable shaderVariable =
shaderAttributes.get(i);
if (shaderVariable.needsRefresh) {
LWJGLShaderUtil.updateAttributeLocation(
shaderVariable, programID);
shaderVariable.needsRefresh = false;
}
LWJGLShaderUtil
.updateShaderAttribute(shaderVariable);
}
for (int i = shaderUniforms.size(); --i >= 0;) {
ShaderVariable shaderVariable =
shaderUniforms.get(i);
if (shaderVariable.needsRefresh) {
LWJGLShaderUtil.updateUniformLocation(
shaderVariable, programID);
LWJGLShaderUtil
.updateShaderUniform(shaderVariable);
shaderVariable.needsRefresh = false;
}
}
}
} else {
ARBShaderObjects.glUseProgramObjectARB(0);
}
}
if (!record.isValid())
record.validate();
}
}
@Override
public StateRecord createStateRecord() {
return new ShaderObjectsStateRecord();
}
/* (non-Javadoc)
* @see com.jme.scene.state.GLSLShaderObjectsState#checkAttributeSizeLimits()
*/
@Override
public void checkAttributeSizeLimits() {
if (shaderAttributes.size() > maxVertexAttribs) {
logger.severe("Too many shader attributes(standard+defined): "
+ shaderAttributes.size() + " maximum: "
+ maxVertexAttribs);
} else if (shaderAttributes.size() + 16 > maxVertexAttribs) {
logger.warning("User defined attributes might overwrite default OpenGL attributes");
}
}
/* (non-Javadoc)
* @see com.jme.scene.state.GLSLShaderObjectsState#checkUniformSizeLimits()
*/
@Override
public void checkUniformSizeLimits() {
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?