Beispiel #1
0
bool ShaderGLES2::bind() {

	if (active != this || !version || new_conditional_version.key != conditional_version.key) {
		conditional_version = new_conditional_version;
		version = get_current_version();
	} else {
		return false;
	}

	ERR_FAIL_COND_V(!version, false);

	if (!version->ok) { //broken, unable to bind (do not throw error, you saw it before already when it failed compilation).
		glUseProgram(0);
		return false;
	}

	glUseProgram(version->id);

	// find out uniform names and locations

	int count;
	glGetProgramiv(version->id, GL_ACTIVE_UNIFORMS, &count);
	version->uniform_names.resize(count);

	for (int i = 0; i < count; i++) {
		GLchar uniform_name[1024];
		int len = 0;
		GLint size = 0;
		GLenum type;

		glGetActiveUniform(version->id, i, 1024, &len, &size, &type, uniform_name);

		uniform_name[len] = '\0';
		String name = String((const char *)uniform_name);

		version->uniform_names.write[i] = name;
	}

	bind_uniforms();

	DEBUG_TEST_ERROR("use program");

	active = this;
	uniforms_dirty = true;

	return true;
}
Beispiel #2
0
    void LineRenderer::render(EngineUniforms *engineUniforms, Material* replacementMaterial) {
        if (!enabled()){
            return;
        }
#ifndef KICK_CONTEXT_ES2
        if (mSmoothLine){
            glEnable(GL_LINE_SMOOTH);
        } else {
            glDisable(GL_LINE_SMOOTH);
        }
#endif
        auto mat = replacementMaterial?replacementMaterial : mMaterial;
        auto shader = mat->shader().get();
        if (mPoints.size()){
            mMesh->bind(shader);
            shader->bind_uniforms(mat, engineUniforms, mTransform.get());
            mMesh->render(0);
        }
    }
Beispiel #3
0
    void Canvas::renderSprites(vector<Sprite*> &sprites, kick::EngineUniforms *engineUniforms, Material* replacementMaterial) {
        if (sprites.size() == 0){
            return;
        }
        updateVertexBuffer(sprites);

        auto mat = replacementMaterial ? replacementMaterial : mMaterial;
        if (!replacementMaterial ){
            mMaterial->setShader(sprites[0]->textureAtlas()->shader());
            mMaterial->setUniform("mainTexture", sprites[0]->textureAtlas()->texture());
        }
        auto shader = mat->shader();
        assert(shader);
        mMesh->bind(shader.get());

        shader->bind_uniforms(mMaterial, engineUniforms, transform().get());

        mMesh->render(0);

        sprites.clear();
    }