Аз съм много нов в шейдърите и имам някакъв GLSL код, за да компилирам правилно (без никакви грешки на компилатора) и по някаква причина продължавам да получавам черен екран. Използвам LWJGL. Продължавам да получавам черен екран, когато се опитвам да изобразя триъгълник, въпреки че трябва да е бял според цвета, който предадох на фрагментния шейдър. Публикувах фрагменти от кода по-долу, надявам се, че има достатъчно, за да разбера какъв е проблемът.
Изходен код на фрагментен шейдър
void main()
{
gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
{
Изходен код на Vertex Shader
void main()
{
gl_Position = ftransform();
}
Код за четене на шейдъри
vertShaderString = shaderName + ".vert";
fragShaderString = shaderName + ".frag";
shader = GL20.glCreateProgram();
vertShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
try{
String temp;
BufferedReader reader = new BufferedReader(new FileReader(new File(vertShaderString)));
while ((temp = reader.readLine()) != null){
vertSource.append(temp).append("\n");
}
reader.close();
BufferedReader fragReader = new BufferedReader(new FileReader(new File(fragShaderString)));
String otherTemp;
while ((otherTemp = fragReader.readLine()) != null){
fragSource.append(otherTemp).append("\n");
}
fragReader.close();
}catch (Exception e){
e.printStackTrace();
}
Код за настройка на шейдъра
GL20.glShaderSource(vertShader, vertSource);
GL20.glCompileShader(vertShader);
if (GL20.glGetShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
System.err.println("Failed to compile vertex shader");
}
GL20.glShaderSource(fragShader, fragSource);
GL20.glCompileShader(fragShader);
if (GL20.glGetShaderi(fragShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
System.err.println("Failed to compile fragment shader");
}
GL20.glAttachShader(shader, vertShader);
GL20.glAttachShader(shader, fragShader);
GL20.glLinkProgram(shader);
GL20.glValidateProgram(shader);
Активиране и деактивиране на Shader Code
public void begin(){
GL20.glUseProgram(shader);
}
public void end(){
GL20.glUseProgram(0);
}
Метод на изобразяване
public void render(){
GL11.glClearColor(0, 0, 0, 1);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glColor4f(1, 0, 0, 1);
shader.begin();
GL11.glBegin(GL11.GL_TRIANGLES);
GL11.glVertex2i(0, 0);
GL11.glVertex2i(500, 0);
GL11.glVertex2i(250, 250);
GL11.glEnd();
shader.end();
}
GL_LINK_STATUS
, както иGL_COMPILE_STATUS
. glGetError също е доста полезен. Рисува ли без активен шейдър? Ако не, може да сочи към рисуване извън проекцията/изгледа. - person jozxyqk   schedule 15.06.2015{
във фрагментния шейдър и вероятно редътfragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
просто не е показан, не мога да забележа нищо очевидно. Въвеждането на синтактична грешка спира ли компилирането на шейдърите? Актуализирали ли сте драйверите си наскоро? - person jozxyqk   schedule 15.06.2015