如何解决GMS2图形着色器仅在DrawGUI中工作
因此,我对着色器非常陌生,并且正在使用GMS2市场上的免费着色器>无论如何,我遇到了与该着色器有关的问题,我想我在着色器中还太陌生,无法对此有所了解。 着色器的代码是:
shd_mosaic.vsh :
attribute vec3 in_Position;
attribute vec4 in_Colour;
attribute vec2 in_TextureCoord;
varying vec2 v_texcoord;
void main()
{
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * vec4(in_Position,1.0);
v_texcoord = in_TextureCoord;
}
shd_mosaic.fsh:
varying vec2 v_texcoord;
uniform float time;
uniform vec2 mouse_pos;
uniform vec2 resolution;
uniform float pixel_amount;
void main()
{
vec2 res = vec2(1.0,resolution.x/resolution.y);
vec2 size = vec2(res.x/pixel_amount,res.y/pixel_amount);
vec2 uv = v_texcoord - mod(v_texcoord,size);
gl_FragColor = texture2D( gm_BaseTexture,uv );
}
然后我还有一个管理着色器的对象obj_controller_mosaic
:
创建代码:
draw_set_color(c_white);
uni_time = shader_get_uniform(shd_mosaic,"time");
var_time_var = 0;
uni_mouse_pos = shader_get_uniform(shd_mosaic,"mouse_pos");
var_mouse_pos_x = mouse_x - camera_get_view_x(view_get_camera(view_current));
var_mouse_pos_y = mouse_y - camera_get_view_y(view_get_camera(view_current));
uni_resolution = shader_get_uniform(shd_mosaic,"resolution");
var_resolution_x = room_width //camera_get_view_width(view_get_camera(view_current));
var_resolution_y = room_height //camera_get_view_height(view_get_camera(view_current));
uni_pixel_amount = shader_get_uniform(shd_mosaic,"pixel_amount");
var_pixel_amount = 700.0;
shader_enabled = true;
full_screen_effect = true;
surf = surface_create(camera_get_view_width(view_get_camera(view_current)),camera_get_view_height(view_get_camera(view_current)));
view_set_surface_id(view_get_camera(view_current),surf);
DrawGUI 代码:
var_time_var+=0.04;
var_resolution_x = camera_get_view_width(view_get_camera(view_current));
var_resolution_y = camera_get_view_height(view_get_camera(view_current));
if shader_enabled shader_set(shd_mosaic);
shader_set_uniform_f(uni_time,var_time_var);
shader_set_uniform_f(uni_mouse_pos,var_mouse_pos_x,var_mouse_pos_y);
shader_set_uniform_f(uni_resolution,var_resolution_x,var_resolution_y);
shader_set_uniform_f(uni_pixel_amount,var_pixel_amount);
if full_screen_effect draw_surface(surf,0);
shader_reset();
好的,现在由于游戏中其他对象的某些问题,我希望DrawGUI代码实际上位于Draw事件中。问题是,当我将代码复制到Draw事件上时,我只是得到了黑屏(当代码在DrawGUI事件中时,它可以正常工作)。我可以做些什么来使此代码在Draw事件而不是DrawGUI中起作用吗?预先感谢您的回答!
解决方法
view_set_surface_id
使视图渲染到表面。结果,它不会自动绘制到屏幕上-您必须自己做,就像在Draw GUI中一样。
如果您真的需要在常规绘制事件中绘制视图,则需要第二个视图并在Draw事件中基于view_current
进行过滤。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。