예제 #1
0
파일: shader.c 프로젝트: 1414648814/ejoy2d
void 
shader_drawbuffer(struct render_buffer * rb, float tx, float ty, float scale) {
	rs_commit();

	RID glid = texture_glid(rb->texid);
	if (glid == 0)
		return;
	shader_texture(glid, 0);
	render_set(RS->R, VERTEXBUFFER, rb->vbid, 0);

	float sx = scale;
	float sy = scale;
	screen_trans(&sx, &sy);
	screen_trans(&tx, &ty);
	float v[4] = { sx, sy, tx, ty };

	// we should call shader_adduniform to add "st" uniform first
	shader_setuniform(PROGRAM_RENDERBUFFER, 0, UNIFORM_FLOAT4, v);

	shader_program(PROGRAM_RENDERBUFFER, NULL);
	RS->drawcall++;

	renderbuffer_commit(rb);

	render_set(RS->R, VERTEXBUFFER, RS->vertex_buffer, 0);
}
예제 #2
0
파일: lshader.c 프로젝트: catinred2/dawn
static int
luniform_set(lua_State *L) {
	int prog = luaL_checkinteger(L, 1);
	shader_program(prog);
	int index = luaL_checkinteger(L, 2);
	enum UNIFORM_FORMAT t = luaL_checkinteger(L, 3);
	float v[16];	// 16 is matrix 4x4
	int n = 0;
	switch(t) {
	case UNIFORM_FLOAT1:
		n = 1;
		break;
	case UNIFORM_FLOAT2:
		n = 2;
		break;
	case UNIFORM_FLOAT3:
		n = 3;
		break;
	case UNIFORM_FLOAT4:
		n = 4;
		break;
	case UNIFORM_FLOAT33:
		n = 9;
		break;
	case UNIFORM_FLOAT44:
		n = 16;
		break;
	default:
		return luaL_error(L, "Invalid uniform format %d", t);
		break;
	}
	int top = lua_gettop(L);
	if (top != n + 3) {
		return luaL_error(L, "Need float %d, only %d passed", n, top - 3);
	}
	int i;
	for (i=0;i<n;i++) {
		v[i] = luaL_checknumber(L, 4+i);
	}
	shader_setuniform(index, t, v);
	return 0;
}